Introduction

Ecological communities are the result of species’ geographic distribution, dispersal capabilities, speciation, environmental filtering, and stochastic events. By definition stochasticic events are random colonization and extinction events that ultimately cause ecological drift. Deterministic processes are non-random environmental processes like environmental filtering, biotic interactions, and niche partitioning. Wetlands isolated in uplands may act as islands, so predictions about stochasticity made by the Theory of Island Biogeography may apply. The following predictions will be tested throughout the Eastern Highland Rim ecoregion:

  1. Wetland size will positively correlate with species richness.

  2. The distance between wetlands will negatively correlate with the similarity of their plant communities.

  3. Differences in plant communities will not significantly differ from a randomly-generated null model.


Methods

Data Collection

Plots were sampled at 27 independent sites throughout a subset of the Eastern Highland Rim ecoregion (delineated in yellow below). Note that some sites were in close proximity, sometimes as close together as 200m apart.

Data was collected for plots using 1 m^2 quadrats, of which there were 1031 total. With a few exceptions, all vascular plant species within each quadrat were identified to the species level. Variables were measured at each site; these include water permanence, early season water depth, late season water depth, water depth change, site area, and land use (grazing).



Data Configuration

Nearly all statistical packages require the data to be in a presence-absence form, typically as matrix with Site as a column so subsamples can be organized accordingly. Rows are named using quadrat codes (plot, transect, quadrat).

Table 1. Sample of data in presence-absence format.
Site CXJOOR JUNDEB JUNREP PROPEC SCICYP CXLOUI
1.1.1 1 1 1 1 1 1 0
1.1.2 1 0 1 0 1 1 1
1.1.3 1 0 0 0 1 1 1
1.1.4 1 1 0 0 1 1 1
1.1.5 1 0 0 0 0 0 1

R Libraries Used

Analyses
-iNEXT, vegan, mclust, MuMIn, lme4

Display/Data Wrangling
-ggplot2, dplyr, tidyr, reshape, knitr, kableExtra, ggfortify, ggpubr, colordistance, otuSummary, stringi, stringr, ggextra, gridextra

Mapping
-geosphere, rgdal, ggmap

Awesomeness
-beepr, wesanderson


Richness

Sites had widely varying observed total richness.

Extrapolation of Richness

The use of extrapolated species accumulation curves can tell us how many species are likely to be at the site based on how many were found in accumulating subsamples.

These curves illustrate not only where the flattening point (expected richness) occurs, but also how quickly. Examining a curve can allow someone to estimate how many more samples would be needed to reach that point, however if doing so samples a larger area then the curve may never flatten.

Sampling Effort

Sampling effort (# quadrats/area sampled) did not affect percent estimated sampling completion.

There is no relationship between sampling effort and completion percentage (F= 0.335, p=0.568).

Model Selection

A negative binomial generalized linear models was used because the response variable (richness) is count data and cannot be negative. Models were made to determine which combinations of variables best explained differences in site richness.

Comparison of models.
Model K df logLik AICc delta
model8 Perm * StrtDpth * DpthChng na.fail 8 -124.21 272.43 0.000
model7 Perm * StrtDpth * DpthChng + Grzng 9 -123.08 274.75 2.323
model6 Perm * StrtDpth * DpthChng + Area 9 -123.24 275.07 2.642
model1 Perm * StrtDpth * DpthChng + Grzng + Area 10 -121.96 277.66 5.235
model9 Perm * StrtDpth + StrtDpth * DpthChnge + DpthChng * Perm 7 -135.93 291.75 19.319
model4 StrtDpth * DpthChng + Grzng + Area 6 -139.04 294.28 21.852
model2 Perm * DpthChng + Grzng + Area 6 -159.06 334.31 61.882
model3 Perm * StrtDpth + Grzng + Area 6 -159.87 335.95 63.519
model5 Perm + StrtDpth + DpthChng + Grzng + Area 6 -166.93 350.05 77.625


The fully crossed model of permanence, early season water depth, and depth change had the most explanatory power, but it contains many interaction terms and should be trimmed down if possible.


Model 8 was dredged, but the markdown failed to knit when this was included. A screenshot of the resulting table was included instead. Variables are abbreviated as follows:

dc= depth change p= water permanence sd= early season water depth



The fully crossed model of permanence, early season water depth, and depth change still had the most explanatory power. This includes a three way interaction, which will make interpretation difficult but it is biologically relevant so it should be included.


Beta Diversity


Beta diversity is a measure of compositional similarity ranging from 0 (sites have the same composition) to 1 (no species overlap between sites). There are multiple ways to measure beta diversity; I used Sorensen’s Dissimilarity Index because I had binary presence-absence data. Beta diversity is calculated as pairwise comparisons, meaning that the output is in matrix-form. This makes it difficult to interpret as-is. Wes Anderson’s sweet colors can help, however.

Geographic Distance

One popular prediction of the Theory of Island Biogeography (and others) is that it is easier for individuals to disperse shorter distances and this results in close sites being more similar than ones far apart. We will test this using a Mantel test, which will test the correlation between the beta diversity matrix above and a geographic distance matrix. I had the test use Spearman’s rank correlation, which is the nonparametric version of the test because the data aren’t normal. This test found that geographic distance and species similarity are not correlated (rm= 0.753,p= 0.139).

Site Variables

A PerMANOVA (Permutational Multivariate Analysis Of Variance) is a nonparametric test that can be used to detect whether the measured variables significantly influence beta diversity. The syntax of this is similar to a GLM, though instead of a response variable you use a response matrix.

Effect of variables on beta diversity. B=9999. The sum r^2 of the variables accounted for by the model is 0.459.
Df SumsOfSqs MeanSqs F.Model R2 Pr(>F)
Permanence 1 0.535 0.535 1.879 0.060 0.021
StartDepth 1 0.371 0.371 1.302 0.041 0.147
DepthChange 1 0.763 0.763 2.681 0.085 0.001
Grazing 1 0.671 0.671 2.357 0.075 0.003
Area 1 0.424 0.424 1.489 0.047 0.070
Permanence:StartDepth 1 0.281 0.281 0.986 0.031 0.458
Permanence:DepthChange 1 0.310 0.310 1.089 0.035 0.334
StartDepth:DepthChange 1 0.427 0.427 1.500 0.048 0.067
Permanence:StartDepth:DepthChange 1 0.333 0.333 1.170 0.037 0.243
Residuals 17 4.841 0.285 NA 0.541 NA
Total 26 8.956 NA NA 1.000 NA


It is difficult to visualize the trends from the PerMANOVA results alone, so they were each plotted by variable. An OLS regression line was added to continuous variables to get a feel for the general trend, but remember: these are not linear relationships!

The coloration of the points corresponds to their corresponding Raup-Crick value. This value is the permutated probability that the beta diversity was the result of deterministic (non-random) processes.


Takeaways

  1. Area was a poor predictor of richness after accounting for other variables. Hydrological variables were much better predictors of richness.

  2. Distance between sites did not significantly correlate with community similarity between sites.

  3. Community similarity was significantly affected by water permanence, water depth change, and grazing.

  4. Stochasticity is dependent on site conditions. Sites that are small, shallow, grazed, and/or experience large seasonal changes in water depth express a larger stochastic signal.

LS0tDQp0aXRsZTogIkRldGVybWluaXN0aWMgcHJvY2Vzc2VzIGRyaXZlIHdldGxhbmQgcGxhbnQgY29tbXVuaXR5IGNvbXBvc2l0aW9uIGFuZCBkaXZlcnNpdHkiDQphdXRob3I6ICJDLiBNLiBDaWFmcmUiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIGh0bWxfbm90ZWJvb2s6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIHJvd3MucHJpbnQ6IDEwDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogbm8NCi0tLQ0KDQpgYGB7ciBzZXR1cDIsIE5PVElDRSBVU0Ugb2YgUEFDTUFOLCBpbmNsdWRlPUZBTFNFfQ0KI2luc3RhbGwgcGFjbWFuIGZpcnN0IHRvIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBhbmQgbG9hZCBhbnkgbmVlZGVkIHBhY2thZ2VzDQpwYWNtYW46OnBfbG9hZChnZ3Bsb3QyLCBkcGx5ciwgdGlkeXIsIHJlc2hhcGUsIGlORVhULCBrbml0ciwga2FibGVFeHRyYSwgZ2dmb3J0aWZ5LCBnZ3B1YnIsIHZlZ2FuLCBnZW9zcGhlcmUsIG1jbHVzdCwgcmdkYWwsIGxlYWZsZXQsIGdnbWFwLCBjb2xvcmRpc3RhbmNlLCBNdU1JbiwgbG1lNCwgYmVlcHIsIHdlc2FuZGVyc29uLCBvdHVTdW1tYXJ5LHN0cmluZ2ksIHN0cmluZ3IsIGdnZXh0cmEsIGdyaWRFeHRyYSkNCg0KI05vdCBzdXJlIHdoeSBJIGtlZXAgdGhpcyBpbg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KDQojTG9hZCBkYXRhDQpzcHB4c2l0ZXM8LXJlYWQuY3N2KCJkYXRhL1ZFR0RBVEFET05FQ09SUi5jc3YiLCBoZWFkZXI9VFJVRSkNCnNpdGVuYW1lczwtcmVhZC5jc3YoImRhdGEvU2l0ZU5hbWVzLmNzdiIsIGhlYWRlcj1UUlVFKQ0Kc2l0ZXNpemVzPC1yZWFkLmNzdigiZGF0YS9TaXRlWHNpemUyLmNzdiIsIGhlYWRlcj1UUlVFKQ0KcXVhZGRhdGFzPC1yZWFkLmNzdigiZGF0YS9xdWFkbWV0cmljcy5jc3YiLCBoZWFkZXI9VFJVRSkNCmNvbG5hbWVzKHF1YWRkYXRhcylbY29sbmFtZXMocXVhZGRhdGFzKT09IkRlcHRoLi5tLiJdIDwtICJEZXB0aCINCmNvbG5hbWVzKHF1YWRkYXRhcylbY29sbmFtZXMocXVhZGRhdGFzKT09IlguLkNhbm9weSJdIDwtICJDYW5vcHkiDQpjb2xuYW1lcyhxdWFkZGF0YXMpW2NvbG5hbWVzKHF1YWRkYXRhcyk9PSJQb25kIl0gPC0gIlNpdGUiDQpzaXRlX3BvaW50cyA8LSBzZWxlY3Qoc2l0ZXNpemVzLCBjKCJTaXRlIiwgIkxhdGl0dWRlIiwgIkxvbmdpdHVkZSIpKQ0KI05vdGU6IHRoZXJlIGlzIG5vIFNpdGUgMTU7IGl0IHdhcyBkaXRjaGVkIGhhbGZ3YXkgdGhyb3VnaCBzYW1wbGluZyBiZWNhdXNlIGl0IHdhcyBub3QgaW5kZXBlbmRlbnQgZnJvbSBTaXRlIDE0Lg0KDQpgYGANCg0KYGBge3IgTG9vcCBtYWdpYywgY2FjaGU9VFJVRSwgaW5jbHVkZT1GQUxTRX0NCnNpdGVzX3N1YjwtdW5pcXVlKHNwcHhzaXRlcyRJRCkNCnNwcF9zdWI8LXVuaXF1ZShzcHB4c2l0ZXMkU3BlY2llcykNCg0KI01ha2UgYSBtYXRyaXggd2l0aCBsb29wIGZ1bmN0aW9uDQpzcHBfY29tbWF0IDwtIG1hdHJpeCgwLCBsZW5ndGgoc2l0ZXNfc3ViKSwgbGVuZ3RoKHNwcF9zdWIpKQ0KZm9yIChpIGluIDE6bnJvdyhzcHBfY29tbWF0KSl7dGVtcF9zaXRlcyA8LSBzcHB4c2l0ZXNbd2hpY2goc3BweHNpdGVzJElEID09IHNpdGVzX3N1YltpXSksXQ0KICBzcHBfY29tbWF0W2ksIHdoaWNoKHNwcF9zdWIlaW4ldGVtcF9zaXRlcyRTcGVjaWVzKV08LSAxDQogIHByaW50KGkpfQ0KDQojTmFtZSByb3dzIGFuZCBDb2x1bW5zDQpyb3duYW1lcyhzcHBfY29tbWF0KSA8LSBhcy5jaGFyYWN0ZXIoc2l0ZXNfc3ViKQ0KY29sbmFtZXMoc3BwX2NvbW1hdCkgPC0gYXMuY2hhcmFjdGVyKHNwcF9zdWIpDQoNCiNDaGFuZ2UgbWF0cml4IGludG8gZGF0YWZyYW1lIGFuZCBtYWtlIGVtcHR5IHF1YWRyYXRzIGVtcHR5DQpzcHBfY29tbWF0LmRmPC0gc3Vic2V0KGFzLmRhdGEuZnJhbWUoc3BwX2NvbW1hdCksIHNlbGVjdD0tYyhFTVBUWSkpDQoNCiNBZGQgc2l0ZSBjb2x1bW4gYmFjayBpbiBhbmQgY2hhbmdlIGl0cyBuYW1lDQpBbGxQb25kcyA8LSBjYmluZChzaXRlbmFtZXMkUG9uZCxzcHBfY29tbWF0LmRmKQ0KbmFtZXMoQWxsUG9uZHMpW25hbWVzKEFsbFBvbmRzKT09InNpdGVuYW1lcyRQb25kIl0gPC0gIlNpdGUiDQoNCmJlZXAoc291bmQgPSAxLCBleHByID0gTlVMTCkNCmBgYA0KDQpgYGB7ciBTcGxpdCBzaXRlcywgaW5jbHVkZT1GQUxTRX0NCiNCcmVhayB1cCBBbGxQb25kcyBpbnRvIGRhdGFmcmFtZXMgYnkgc2l0ZQ0KI1RoZSBmaXJzdCBjb2x1bW4gaGFzIHRvIGJlIHJlbW92ZWQgZm9yIGVhY2gNCiNUcmFuc3Bvc2UgdGhlIGRhdGFmcmFtZXMgc28gc3BlY2llcyBhcmUgY29sdW1ucw0KDQpTMDE8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxKSwgLTEpKQ0KUzAyPC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMiksIC0xKSkNClMwMzwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDMpLCAtMSkpDQpTMDQ8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSA0KSwgLTEpKQ0KUzA1PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gNSksIC0xKSkNClMwNjwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDYpLCAtMSkpDQpTMDc8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSA3KSwgLTEpKQ0KUzA4PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gOCksIC0xKSkNClMwOTwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDkpLCAtMSkpDQpTMTA8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxMCksIC0xKSkNClMxMTwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDExKSwgLTEpKQ0KUzEyPC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMTIpLCAtMSkpDQpTMTM8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxMyksIC0xKSkNClMxNDwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDE0KSwgLTEpKQ0KUzE2PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMTYpLCAtMSkpDQpTMTc8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxNyksIC0xKSkNClMxODwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDE4KSwgLTEpKQ0KUzE5PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMTkpLCAtMSkpDQpTMjA8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyMCksIC0xKSkNClMyMTwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDIxKSwgLTEpKQ0KUzIyPC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMjIpLCAtMSkpDQpTMjM8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyMyksIC0xKSkNClMyNDwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDI0KSwgLTEpKQ0KUzI1PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMjUpLCAtMSkpDQpTMjY8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyNiksIC0xKSkNClMyNzwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDI3KSwgLTEpKQ0KUzI4PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMjgpLCAtMSkpDQpgYGANCg0KYGBge3IgVW5pY29ybiB2b21pdCBwcmVwLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY2FjaGU9VFJVRSwgaW5jbHVkZT1GQUxTRX0NCiNNYWtlIGEgbGlzdCBvZiBhbGwgc2l0ZSBkYXRhZnJhbWVzDQpzaXRlLmxpc3QuYWxsID0gbGlzdChTMDE9UzAxLFMwMj1TMDIsUzAzPVMwMyxTMDQ9UzA0LFMwNT1TMDUsUzA2PVMwNixTMDc9UzA3LFMwOD1TMDgsUzA5PVMwOSxTMTA9UzEwLFMxMT1TMTEsUzEyPVMxMixTMTM9UzEzLFMxND1TMTQsUzE2PVMxNixTMTc9UzE3LFMxOD1TMTgsUzE5PVMxOSxTMjA9UzIwLFMyMT1TMjEsUzIyPVMyMixTMjM9UzIzLFMyND1TMjQsUzI1PVMyNSxTMjY9UzI2LFMyNz1TMjcsUzI4PVMyOCkNCiNDb252ZXJ0IGV2ZXJ5dGhpbmcgaW4gbGlzdCB0byBpbmNpZGVuY2UgZnJlcXVlbmNpZXMNCnNpdGUubGlzdC5mcmVxLmFsbCA9IGxhcHBseShzaXRlLmxpc3QuYWxsLCBhcy5pbmNmcmVxKQ0KYGBgDQoNCmBgYHtyIFVuaWNvcm4gdm9taXQgcHJlcDIsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjYWNoZT1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0Kb3V0LmluYy5hbGw8LWlORVhUKHNpdGUubGlzdC5mcmVxLmFsbCwgcT0wLCBkYXRhdHlwZT0iaW5jaWRlbmNlX2ZyZXEiLCBuYm9vdD05OTkpDQpiZWVwKHNvdW5kID0gMSwgZXhwciA9IE5VTEwpDQpgYGANCg0KYGBge3IgUmljaERpdiwgaW5jbHVkZT1GQUxTRX0NCiNUaGUgaU5FWFQgb3V0cHV0ICgib3V0LmluYy5hbGwiKSBjb250YWlucyB0aHJlZSB0YWJsZXM7ICJBc3lFc3QiIGhhcyBhbGwgdGhlIGRhdGEgd2UgbmVlZA0KI1NhdmVkIGl0IGFzIGFuIG9iamVjdCBhbmQgY2hhbmdlZCBpdCBzbyBpdCB3b3VsZCBiZSBtb3JlIHJlYWRhYmxlDQpSaWNoRGl2PC1vdXQuaW5jLmFsbCRBc3lFc3QNClJpY2hEaXZUPC1zdWJzZXQoUmljaERpdiwgc2VsZWN0PS1jKHMuZS4sIExDTCwgVUNMKSkNClJpY2hEaXZPYnM8LXN1YnNldChzcHJlYWQoUmljaERpdlQsIERpdmVyc2l0eSwgT2JzZXJ2ZWQpLCBzZWxlY3Q9LWMoRXN0aW1hdG9yKSkNClJpY2hEaXZFc3Q8LXN1YnNldChzcHJlYWQoUmljaERpdlQsIERpdmVyc2l0eSwgRXN0aW1hdG9yKSwgc2VsZWN0PS1jKE9ic2VydmVkKSkNCiNUcmltIGRvd24gY29sdW1uIG5hbWVzIHNvIHRoZXkgZG9uJ3Qgc3Vjaw0KbmFtZXMoUmljaERpdk9icyk8LWMoIlNpdGUiLCAiUmljaG5lc3NPYnMiLCAiU2hhbm5vbk9icyIsICJTaW1wc29uT2JzIikNCm5hbWVzKFJpY2hEaXZFc3QpPC1jKCJTaXRlIiwgIlJpY2huZXNzRXhwIiwgIlNoYW5ub25FeHAiLCAiU2ltcHNvbkV4cCIpDQojQ29sbGFwc2Ugc2l0ZXM7IGhhdmUgdG8gZG8gZnVua3kgdGhpbmdzIHRvIGRlYWwgd2l0aCBOQXMNCmNvbXByZXNzIDwtIGZ1bmN0aW9uKHgpIGMobmEub21pdCh4KSwgTkEpWzFdDQpSaWNoRGl2T2JzLjE8LWFnZ3JlZ2F0ZShSaWNoRGl2T2JzWzI6NF0sIFJpY2hEaXZPYnNbMV0sIGNvbXByZXNzKQ0KUmljaERpdkVzdC4xPC1zdWJzZXQoYWdncmVnYXRlKFJpY2hEaXZFc3RbMjo0XSwgUmljaERpdkVzdFsxXSwgY29tcHJlc3MpLCBzZWxlY3Q9LWMoU2l0ZSkpDQojTWVyZ2UgZXZlcnlib2R5IHRvZ2V0aGVyDQpSaWNoRGl2RmluYWw8LWNiaW5kKFJpY2hEaXZPYnMuMSwgUmljaERpdkVzdC4xKQ0KI1Jlb3JkZXIgY29sdW1ucyBzbyB0aGV5IG1ha2Ugc2Vuc2UNClJpY2hEaXZGaW5hbFssYygxLDIsNSwzLDYsNCw3KV0NCiNNYWtlIGEgbmljZSB0YWJsZQ0KS2FibGU8LWthYmxlKFJpY2hEaXZGaW5hbCwgZm9ybWF0ID0gInBhbmRvYyIsIGZ1bGxfd2lkdGg9RiwgY2FwdGlvbiA9ICdUYWJsZSAyLiBPYnNlcnZlZCBhbmQgZXhwZWN0ZWQgSGlsbCBudW1iZXJzLicpDQpgYGANCg0KYGBge3IgRXN0IGFuZCBPYnMgUmljaG5lc3MsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KUmljaG5lc3NPbmx5PC1maWx0ZXIoUmljaERpdiwgRGl2ZXJzaXR5ID09ICJTcGVjaWVzIHJpY2huZXNzIikNCmNvbG5hbWVzKFJpY2huZXNzT25seSlbY29sbmFtZXMoUmljaG5lc3NPbmx5KT09IkxDTCJdIDwtICJSaWNoTENMIg0KY29sbmFtZXMoUmljaG5lc3NPbmx5KVtjb2xuYW1lcyhSaWNobmVzc09ubHkpPT0iVUNMIl0gPC0gIlJpY2hVQ0wiDQpjb2xuYW1lcyhSaWNobmVzc09ubHkpW2NvbG5hbWVzKFJpY2huZXNzT25seSk9PSJFc3RpbWF0b3IiXSA8LSAiRXN0aW1hdGVkIg0KUmljaEdhdGg8LWdhdGhlcihSaWNobmVzc09ubHksUmljaG5lc3MsdmFsdWUsT2JzZXJ2ZWQ6RXN0aW1hdGVkKQ0KIyBSaWNoU2l6ZTwtIGNiaW5kKFJpY2hHYXRoLCBzaXRlc2l6ZXMkUXVhZHJhdHMpDQojIGNvbG5hbWVzKFJpY2hTaXplKVtjb2xuYW1lcyhSaWNoU2l6ZSk9PSJzaXRlc2l6ZXMkUXVhZHJhdHMiXSA8LSAiUXVhZHJhdHMiDQpgYGANCg0KYGBge3IgRGF0YSByZWFycmFuZ2luZywgZWNobz1GQUxTRSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpJbnRlcnZhbHM8LXNlbGVjdChzbGljZShSaWNoR2F0aCwgYygyODo1NCkpLCBjKFJpY2hMQ0wsIFJpY2hVQ0wpKQ0KUmljaEludHM8LWNiaW5kKFJpY2hEaXZGaW5hbCwgSW50ZXJ2YWxzKQ0KUmljaEludHMkUGVyY0NvbXBsZXRlIDwtIFJpY2hJbnRzJFJpY2huZXNzT2JzL1JpY2hJbnRzJFJpY2huZXNzRXhwKjEwMA0KUmljaEludHMkUGVyY0NvbXBsZXRlVTwtIFJpY2hJbnRzJFJpY2huZXNzT2JzL1JpY2hJbnRzJFJpY2hVQ0wqMTAwDQpSaWNoSW50cyRQZXJjQ29tcGxldGVMPC0gUmljaEludHMkUmljaG5lc3NPYnMvUmljaEludHMkUmljaExDTCoxMDANCnNpdGVzaXplcyRRdWFkc0FyZWE8LSBzaXRlc2l6ZXMkUXVhZHJhdHMvKHBpKihzaXRlc2l6ZXMkTGVuZ3RoXjIpKQ0Kc2l0ZXNpemVzJEFyZWE8LShwaSooc2l0ZXNpemVzJExlbmd0aF4yKSkNCmBgYA0KDQpgYGB7ciBMTSBTYW1wbGluZyBzdWZmaWNpZW5jeSwgaW5jbHVkZT1GQUxTRX0NCmxtUmljaFF1YWQgPC0gbG0oUmljaEludHMkUGVyY0NvbXBsZXRlIH4gc2l0ZXNpemVzJFF1YWRzQXJlYSkNCmF1dG9wbG90KGxtUmljaFF1YWQpDQphUmljaFF1YWQ8LWFub3ZhKGxtUmljaFF1YWQpDQphUmljaFF1YWQ8LSByb3VuZChhUmljaFF1YWQsMykNCmBgYA0KDQpgYGB7ciBTaXRlIHNpemUgYW5kIHJpY2huZXNzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBxdWFkZGllczwtbWVyZ2Uoc2l0ZXNpemVzLCBSaWNoSW50cywgYnk9IlNpdGUiKQ0KIyBxdWFkZGllcyRMYXRpdHVkZSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihxdWFkZGllcyRMYXRpdHVkZSkpDQpgYGANCg0KYGBge3IgU29yZW5zZW4gdGltZSwgaW5jbHVkZT1GQUxTRX0NCnN1bTAxPC1yb3dTdW1zKFMwMSkNCnN1bTAyPC1yb3dTdW1zKFMwMikNCnN1bTAzPC1yb3dTdW1zKFMwMykNCnN1bTA0PC1yb3dTdW1zKFMwNCkNCnN1bTA1PC1yb3dTdW1zKFMwNSkNCnN1bTA2PC1yb3dTdW1zKFMwNikNCnN1bTA3PC1yb3dTdW1zKFMwNykNCnN1bTA4PC1yb3dTdW1zKFMwOCkNCnN1bTA5PC1yb3dTdW1zKFMwOSkNCnN1bTEwPC1yb3dTdW1zKFMxMCkNCnN1bTExPC1yb3dTdW1zKFMxMSkNCnN1bTEyPC1yb3dTdW1zKFMxMikNCnN1bTEzPC1yb3dTdW1zKFMxMykNCnN1bTE0PC1yb3dTdW1zKFMxNCkNCnN1bTE2PC1yb3dTdW1zKFMxNikNCnN1bTE3PC1yb3dTdW1zKFMxNykNCnN1bTE4PC1yb3dTdW1zKFMxOCkNCnN1bTE5PC1yb3dTdW1zKFMxOSkNCnN1bTIwPC1yb3dTdW1zKFMyMCkNCnN1bTIxPC1yb3dTdW1zKFMyMSkNCnN1bTIyPC1yb3dTdW1zKFMyMikNCnN1bTIzPC1yb3dTdW1zKFMyMykNCnN1bTI0PC1yb3dTdW1zKFMyNCkNCnN1bTI1PC1yb3dTdW1zKFMyNSkNCnN1bTI2PC1yb3dTdW1zKFMyNikNCnN1bTI3PC1yb3dTdW1zKFMyNykNCnN1bTI4PC1yb3dTdW1zKFMyOCkNCg0Kc3VtbWFyeTwtYXMuZGF0YS5mcmFtZShyYmluZChzdW0wMSwgc3VtMDIsIHN1bTAzLCBzdW0wNCwgc3VtMDUsIHN1bTA2LCBzdW0wNywgc3VtMDgsIHN1bTA5LCBzdW0xMCwgc3VtMTEsIHN1bTEyLCBzdW0xMywgc3VtMTQsIHN1bTE2LCBzdW0xNywgc3VtMTgsIHN1bTE5LCBzdW0yMCwgc3VtMjEsIHN1bTIyLCBzdW0yMywgc3VtMjQsIHN1bTI1LCBzdW0yNiwgc3VtMjcsIHN1bTI4KSkNCnN1bW1hcnlbc3VtbWFyeSA+IDBdIDwtIDENCnJvd25hbWVzKHN1bW1hcnkpPC1jKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIxMCIsICIxMSIsICIxMiIsICIxMyIsICIxNCIsICIxNiIsICIxNyIsICIxOCIsICIxOSIsICIyMCIsICIyMSIsICIyMiIsICIyMyIsICIyNCIsICIyNSIsICIyNiIsICIyNyIsICIyOCIpDQpzdW1wZXJtPC1hcy5kYXRhLmZyYW1lKHN1bW1hcnkpDQpyb3duYW1lcyhzdW1wZXJtKTwtYygidGVtcDEiLCAidGVtcDIiLCAicGVybTMiLCAicGVybTQiLCAicGVybTUiLCAicGVybTYiLCAicGVybTciLCAicGVybTgiLCAicGVybTkiLCAicGVybTEwIiwgInBlcm0xMSIsICJwZXJtMTIiLCAicGVybTEzIiwgInBlcm0xNCIsICJ0ZW1wMTYiLCAicGVybTE3IiwgInBlcm0xOCIsICJ0ZW1wMTkiLCAicGVybTIwIiwgInRlbXAyMSIsICJwZXJtMjIiLCAicGVybTIzIiwgInRlbXAyNCIsICJ0ZW1wMjUiLCAidGVtcDI2IiwgInBlcm0yNyIsICJ0ZW1wMjgiKQ0KDQpzdW1ncmF6PC1hcy5kYXRhLmZyYW1lKHN1bW1hcnkpDQpyb3duYW1lcyhzdW1ncmF6KTwtYygibm8xIiwgIm5vMiIsICJubzMiLCAibm80IiwgImdyYXo1IiwgIm5vNiIsICJncmF6NyIsICJubzgiLCAiZ3JhejkiLCAiZ3JhejEwIiwgIm5vMTEiLCAibm8xMiIsICJncmF6MTMiLCAibm8xNCIsICJubzE2IiwgImdyYXoxNyIsICJubzE4IiwgIm5vMTkiLCAibm8yMCIsICJubzIxIiwgIm5vMjIiLCAibm8yMyIsICJubzI0IiwgIm5vMjUiLCAibm8yNiIsICJubzI3IiwgIm5vMjgiKQ0KDQoNCnN1bXM8LWNvbFN1bXMoc3VtbWFyeSkNCg0KIyMjVE8gREVMRVRFIFNJTkdMRVRPTlMNCnN1bXN1bXM8LXJiaW5kKHN1bXMsIHN1bW1hcnkpDQojQ29udmVydCB0byBiaW5hcnkNCnJvd25hbWVzKHN1bXN1bXMpWzFdPC0ic3VtIg0KI0NvbnZlcnQgdG8gYmluYXJ5DQpyb3duYW1lcyhzdW1zdW1zKVsxXTwtInN1bSINCnN1bXN1bXMxIDwtIHN1bXN1bXNbLHN1bXMgPiAxXQ0Kc3Vtc3VtczE8LXNsaWNlKHN1bXN1bXMxLCAtYygxKSkNCm5jb2woc3Vtc3Vtc1ssc3VtcyA9PSAxXSkNCiMyMjYgc2luZ2xldG9ucyENCm5jb2woc3Vtc3Vtc1ssc3VtcyA9PSAyXSkNCiM3MCBkb3VibGV0b25zIQ0KIyBzdW1zdW1zMiA8LSBzdW1zdW1zWyxzdW1zID4gMl0NCiMgc3BlY2llc2ZyZXE8LXNlbGVjdChhcy5kYXRhLmZyYW1lKHQoc3Vtc3VtcykpLCBjKDEpKQ0KIyBzdW1zdW1zMjwtc2xpY2Uoc3Vtc3VtczEsIC1jKDEpKQ0KIzA9aWRlbnRpY2FsLCAxPXRoZSBtb3N0IGRpc3NpbWlsYXINCnNvcmVuc2VuPC12ZWdkaXN0KHN1bXN1bXMxLCBtZXRob2Q9ImJyYXkiLCBiaW5hcnk9VFJVRSwgZGlhZz1UUlVFLCB1cHBlcj1GQUxTRSwgbmEucm0gPSBGQUxTRSkNCnNvcmVuc2VuLm0udDwtc2lnbmlmKGFzLm1hdHJpeChzb3JlbnNlbiksIGRpZ2l0cz0zKQ0KDQpzb3JlbnNlbkFMTDwtdmVnZGlzdChzbGljZShzdW1zdW1zLCAtYygxKSksIG1ldGhvZD0iYnJheSIsIGJpbmFyeT1UUlVFLCBkaWFnPVRSVUUsIHVwcGVyPUZBTFNFLCBuYS5ybSA9IEZBTFNFKQ0Kc29yZW5zZW5BbGwubS50PC1zaWduaWYoYXMubWF0cml4KHNvcmVuc2VuQUxMKSwgZGlnaXRzPTMpDQpgYGANCg0KYGBge3IgRGlzdGFuY2UgTWF0cml4LCBpbmNsdWRlPUZBTFNFfQ0Kc2l0ZXNpemVzZ2VvPC1zZWxlY3Qoc2l0ZXNpemVzLCBjKCJTaXRlIiwgIkxhdGl0dWRlIiwgIkxvbmdpdHVkZSIpKQ0Kc2l0ZXNpemVzZ2VvLjE8LXNpdGVzaXplc2dlb1ssYygxLDMsMildDQpzaXRlc2l6ZXNnZW8uMjwtc2l0ZXNpemVzZ2VvLjFbLGMoMiwzKV0NCmRpc3RhbmNlLm08LWRpc3RtKHNpdGVzaXplc2dlby4yKQ0KYGBgDQo8ZmlndXJlPg0KPGltZyBzcmM9IkltYWdlcy9iYXJrY3JvcHBlZC5qcGciPjwvZmlndXJlPjxicj4NCg0KIyMgSW50cm9kdWN0aW9uIA0KDQpFY29sb2dpY2FsIGNvbW11bml0aWVzIGFyZSB0aGUgcmVzdWx0IG9mIHNwZWNpZXPigJkgZ2VvZ3JhcGhpYyBkaXN0cmlidXRpb24sIGRpc3BlcnNhbCBjYXBhYmlsaXRpZXMsIHNwZWNpYXRpb24sIGVudmlyb25tZW50YWwgZmlsdGVyaW5nLCBhbmQgc3RvY2hhc3RpYyBldmVudHMuIEJ5IGRlZmluaXRpb24gc3RvY2hhc3RpY2ljIGV2ZW50cyBhcmUgcmFuZG9tIGNvbG9uaXphdGlvbiBhbmQgZXh0aW5jdGlvbiBldmVudHMgdGhhdCB1bHRpbWF0ZWx5IGNhdXNlIGVjb2xvZ2ljYWwgZHJpZnQuIERldGVybWluaXN0aWMgcHJvY2Vzc2VzIGFyZSBub24tcmFuZG9tIGVudmlyb25tZW50YWwgcHJvY2Vzc2VzIGxpa2UgZW52aXJvbm1lbnRhbCBmaWx0ZXJpbmcsIGJpb3RpYyBpbnRlcmFjdGlvbnMsIGFuZCBuaWNoZSBwYXJ0aXRpb25pbmcuIFdldGxhbmRzIGlzb2xhdGVkIGluIHVwbGFuZHMgbWF5IGFjdCBhcyBpc2xhbmRzLCBzbyBwcmVkaWN0aW9ucyBhYm91dCBzdG9jaGFzdGljaXR5IG1hZGUgYnkgdGhlIFRoZW9yeSBvZiBJc2xhbmQgQmlvZ2VvZ3JhcGh5IG1heSBhcHBseS4gVGhlIGZvbGxvd2luZyBwcmVkaWN0aW9ucyB3aWxsIGJlIHRlc3RlZCB0aHJvdWdob3V0IHRoZSBFYXN0ZXJuIEhpZ2hsYW5kIFJpbSBlY29yZWdpb246DQoNCjEuIFdldGxhbmQgc2l6ZSB3aWxsIHBvc2l0aXZlbHkgY29ycmVsYXRlIHdpdGggc3BlY2llcyByaWNobmVzcy4NCg0KMi4gVGhlIGRpc3RhbmNlIGJldHdlZW4gd2V0bGFuZHMgd2lsbCBuZWdhdGl2ZWx5IGNvcnJlbGF0ZSB3aXRoIHRoZSBzaW1pbGFyaXR5IG9mIHRoZWlyIHBsYW50IGNvbW11bml0aWVzLg0KDQozLiBEaWZmZXJlbmNlcyBpbiBwbGFudCBjb21tdW5pdGllcyB3aWxsIG5vdCBzaWduaWZpY2FudGx5IGRpZmZlciBmcm9tIGEgcmFuZG9tbHktZ2VuZXJhdGVkIG51bGwgbW9kZWwuIA0KDQotLS0tLS0NCg0KIyMgTWV0aG9kcyANCg0KIyMjIERhdGEgQ29sbGVjdGlvbg0KDQpQbG90cyB3ZXJlIHNhbXBsZWQgYXQgMjcgaW5kZXBlbmRlbnQgc2l0ZXMgdGhyb3VnaG91dCBhIHN1YnNldCBvZiB0aGUgRWFzdGVybiBIaWdobGFuZCBSaW0gZWNvcmVnaW9uIChkZWxpbmVhdGVkIGluIHllbGxvdyBiZWxvdykuIE5vdGUgdGhhdCBzb21lIHNpdGVzIHdlcmUgaW4gY2xvc2UgcHJveGltaXR5LCBzb21ldGltZXMgYXMgY2xvc2UgdG9nZXRoZXIgYXMgMjAwbSBhcGFydC4NCmBgYHtyIFN0YXRpYyBtYXAgcHJlcCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCkVIUmEgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2Eua21sIikNCkVIUmIgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2Iua21sIikNCkVIUmMgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2Mua21sIikNCkVIUmQgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2Qua21sIikNCkVIUmUgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2Uua21sIikNCkVIUmYgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2Yua21sIikNCkVIUmcgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2cua21sIikNCkVIUmggPC0gcmVhZE9HUigiTWFwcHlCaXRzL2gua21sIikNCkVIUmkgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2kua21sIikNCkVIUmogPC0gcmVhZE9HUigiTWFwcHlCaXRzL2oua21sIikNCkVIUmsgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2sua21sIikNCkVIUmwgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2wua21sIikNCg0Kb3V0bGluZV9wb2ludHNhIDwtIEVIUmFAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNhKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lYSA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzYSkNCnNwX291dGxpbmVhIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWEpLDEpDQpvdXRsaW5lX3BvbHlhIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVhKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWEpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNiIDwtIEVIUmJAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNiKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lYiA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzYikNCnNwX291dGxpbmViIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWIpLDEpDQpvdXRsaW5lX3BvbHliIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmViKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWIpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNjIDwtIEVIUmNAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNjKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lYyA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzYykNCnNwX291dGxpbmVjIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWMpLDEpDQpvdXRsaW5lX3BvbHljIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVjKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWMpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNkIDwtIEVIUmRAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNkKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lZCA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzZCkNCnNwX291dGxpbmVkIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWQpLDEpDQpvdXRsaW5lX3BvbHlkIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVkKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWQpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNlIDwtIEVIUmVAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNlKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lZSA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzZSkNCnNwX291dGxpbmVlIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWUpLDEpDQpvdXRsaW5lX3BvbHllIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVlKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWUpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNmIDwtIEVIUmZAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNmKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lZiA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzZikNCnNwX291dGxpbmVmIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWYpLDEpDQpvdXRsaW5lX3BvbHlmIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVmKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWYpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNnIDwtIEVIUmdAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNnKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lZyA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzZykNCnNwX291dGxpbmVnIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWcpLDEpDQpvdXRsaW5lX3BvbHlnIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVnKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWcpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNoIDwtIEVIUmhAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNoKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5laCA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzaCkNCnNwX291dGxpbmVoIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWgpLDEpDQpvdXRsaW5lX3BvbHloIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVoKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWgpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNpIDwtIEVIUmlAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNpKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5laSA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzaSkNCnNwX291dGxpbmVpIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWkpLDEpDQpvdXRsaW5lX3BvbHlpIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVpKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWkpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNqIDwtIEVIUmpAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNqKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5laiA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzaikNCnNwX291dGxpbmVqIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWopLDEpDQpvdXRsaW5lX3BvbHlqIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVqKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWopIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNrIDwtIEVIUmtAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNrKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5layA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzaykNCnNwX291dGxpbmVrIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWspLDEpDQpvdXRsaW5lX3BvbHlrIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVrKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWspIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNsIDwtIEVIUmxAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNsKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lbCA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzbCkNCnNwX291dGxpbmVsIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWwpLDEpDQpvdXRsaW5lX3BvbHlsIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVsKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWwpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCmBgYA0KYGBge3IgU3RhdGljIG1hcCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD02fQ0Kc3RhdGUgPC0gbWFwX2RhdGEoInN0YXRlIikNCmNvdW50eSA8LSBtYXBfZGF0YSgiY291bnR5IikNCg0KDQp0biA8LSBjb3VudHkgJT4lIA0KICBmaWx0ZXIocmVnaW9uPT0idGVubmVzc2VlIikNCmt5IDwtIGNvdW50eSAlPiUgDQogIGZpbHRlcihyZWdpb249PSJrZW50dWNreSIpDQphbCA8LSBjb3VudHkgJT4lIA0KICBmaWx0ZXIocmVnaW9uPT0iYWxhYmFtYSIpDQoNCg0KZ2dwbG90KCkgKyAgDQogIGdlb21fcG9seWdvbihkYXRhID0gc3RhdGUsIGFlcyh4PWxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLA0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yPSJibGFjayIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB0biwgYWVzKHg9bG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCksDQogICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gIndoaXRlIiwgY29sb3I9ImJsYWNrIikgKw0KICBnZW9tX3BvbHlnb24oZGF0YSA9IGt5LCBhZXMoeD1sb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAid2hpdGUiLCBjb2xvcj0iYmxhY2siKSArDQogIGdlb21fcG9seWdvbihkYXRhID0gYWwsIGFlcyh4PWxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLA0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yPSJibGFjayIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGE9b3V0bGluZV9wb2x5YSwgYWVzKHg9b3V0bGluZV9wb2x5YUBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1vdXRsaW5lX3BvbHlhQHBvbHlnb25zW1sxXV1AUG9seWdvbnNbWzFdXUBjb29yZHNbLDJdKSwNCiAgICAgICAgICAgICAgIGFscGhhID0gLjgsIGZpbGw9Im9yYW5nZSIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGE9b3V0bGluZV9wb2x5YiwgYWVzKHg9b3V0bGluZV9wb2x5YkBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1vdXRsaW5lX3BvbHliQHBvbHlnb25zW1sxXV1AUG9seWdvbnNbWzFdXUBjb29yZHNbLDJdKSwNCiAgICAgICAgICAgICAgIGFscGhhID0gLjgsIGZpbGw9Im9yYW5nZSIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGE9b3V0bGluZV9wb2x5YywgYWVzKHg9b3V0bGluZV9wb2x5Y0Bwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1vdXRsaW5lX3BvbHljQHBvbHlnb25zW1sxXV1AUG9seWdvbnNbWzFdXUBjb29yZHNbLDJdKSwNCiAgICAgICAgICAgICAgIGFscGhhID0gLjgsIGZpbGw9Im9yYW5nZSIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGE9b3V0bGluZV9wb2x5ZCwgYWVzKHg9b3V0bGluZV9wb2x5ZEBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1vdXRsaW5lX3BvbHlkQHBvbHlnb25zW1sxXV1AUG9seWdvbnNbWzFdXUBjb29yZHNbLDJdKSwNCiAgICAgICAgICAgICAgIGFscGhhID0gLjgsIGZpbGw9Im9yYW5nZSIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGE9b3V0bGluZV9wb2x5ZSwgYWVzKHg9b3V0bGluZV9wb2x5ZUBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1vdXRsaW5lX3BvbHllQHBvbHlnb25zW1sxXV1AUG9seWdvbnNbWzFdXUBjb29yZHNbLDJdKSwNCiAgICAgICAgICAgICAgIGFscGhhID0gLjgsIGZpbGw9Im9yYW5nZSIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGE9b3V0bGluZV9wb2x5ZiwgYWVzKHg9b3V0bGluZV9wb2x5ZkBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1vdXRsaW5lX3BvbHlmQHBvbHlnb25zW1sxXV1AUG9seWdvbnNbWzFdXUBjb29yZHNbLDJdKSwNCiAgICAgICAgICAgICAgIGFscGhhID0gLjgsIGZpbGw9Im9yYW5nZSIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGE9b3V0bGluZV9wb2x5ZywgYWVzKHg9b3V0bGluZV9wb2x5Z0Bwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1vdXRsaW5lX3BvbHlnQHBvbHlnb25zW1sxXV1AUG9seWdvbnNbWzFdXUBjb29yZHNbLDJdKSwNCiAgICAgICAgICAgICAgIGFscGhhID0gLjgsIGZpbGw9Im9yYW5nZSIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGE9b3V0bGluZV9wb2x5aCwgYWVzKHg9b3V0bGluZV9wb2x5aEBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1vdXRsaW5lX3BvbHloQHBvbHlnb25zW1sxXV1AUG9seWdvbnNbWzFdXUBjb29yZHNbLDJdKSwNCiAgICAgICAgICAgICAgIGFscGhhID0gLjgsIGZpbGw9Im9yYW5nZSIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGE9b3V0bGluZV9wb2x5aSwgYWVzKHg9b3V0bGluZV9wb2x5aUBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1vdXRsaW5lX3BvbHlpQHBvbHlnb25zW1sxXV1AUG9seWdvbnNbWzFdXUBjb29yZHNbLDJdKSwNCiAgICAgICAgICAgICAgIGFscGhhID0gLjgsIGZpbGw9Im9yYW5nZSIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGE9b3V0bGluZV9wb2x5aiwgYWVzKHg9b3V0bGluZV9wb2x5akBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1vdXRsaW5lX3BvbHlqQHBvbHlnb25zW1sxXV1AUG9seWdvbnNbWzFdXUBjb29yZHNbLDJdKSwNCiAgICAgICAgICAgICAgIGFscGhhID0gLjgsIGZpbGw9Im9yYW5nZSIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGE9b3V0bGluZV9wb2x5aywgYWVzKHg9b3V0bGluZV9wb2x5a0Bwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1vdXRsaW5lX3BvbHlrQHBvbHlnb25zW1sxXV1AUG9seWdvbnNbWzFdXUBjb29yZHNbLDJdKSwNCiAgICAgICAgICAgICAgIGFscGhhID0gLjgsIGZpbGw9Im9yYW5nZSIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGE9b3V0bGluZV9wb2x5bCwgYWVzKHg9b3V0bGluZV9wb2x5bEBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1vdXRsaW5lX3BvbHlsQHBvbHlnb25zW1sxXV1AUG9seWdvbnNbWzFdXUBjb29yZHNbLDJdKSwNCiAgICAgICAgICAgICAgIGFscGhhID0gLjgsIGZpbGw9Im9yYW5nZSIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gc2l0ZV9wb2ludHMsIGFlcyh4PUxvbmdpdHVkZSx5PUxhdGl0dWRlKSwgY29sb3I9ImJsYWNrIikgKw0KICBjb29yZF9maXhlZCh4bGltID0gYygtOTAuNSwgLTgyKSwgIHlsaW0gPSBjKDM0LjUsIDM3LjYpLCByYXRpbyA9IDEuMikgKw0KICB4bGFiKCJMb25naXR1ZGUiKSArIHlsYWIoIkxhdGl0dWRlIikgKyBnZ3RpdGxlKCJFYXN0ZXJuIEhpZ2hsYW5kIFJpbSBTdWJzZXQgKGdvbGQgcG9seWdvbikgYW5kIFN0dWR5IFNpdGVzIikNCmBgYA0KDQpEYXRhIHdhcyBjb2xsZWN0ZWQgZm9yIHBsb3RzIHVzaW5nIDEgbV4yIHF1YWRyYXRzLCBvZiB3aGljaCB0aGVyZSB3ZXJlIDEwMzEgdG90YWwuIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgYWxsIHZhc2N1bGFyIHBsYW50IHNwZWNpZXMgd2l0aGluIGVhY2ggcXVhZHJhdCB3ZXJlIGlkZW50aWZpZWQgdG8gdGhlIHNwZWNpZXMgbGV2ZWwuIFZhcmlhYmxlcyB3ZXJlIG1lYXN1cmVkIGF0IGVhY2ggc2l0ZTsgdGhlc2UgaW5jbHVkZSB3YXRlciBwZXJtYW5lbmNlLCBlYXJseSBzZWFzb24gd2F0ZXIgZGVwdGgsIGxhdGUgc2Vhc29uIHdhdGVyIGRlcHRoLCB3YXRlciBkZXB0aCBjaGFuZ2UsIHNpdGUgYXJlYSwgYW5kIGxhbmQgdXNlIChncmF6aW5nKS4NCg0KPGJyPjxmaWd1cmU+DQo8aW1nIHNyYz0iSW1hZ2VzL1F1YWRyYXRDcm9wcGVkLmpwZyI+PC9maWd1cmU+PGJyPg0KDQojIyMgRGF0YSBDb25maWd1cmF0aW9uDQoNCk5lYXJseSBhbGwgc3RhdGlzdGljYWwgcGFja2FnZXMgcmVxdWlyZSB0aGUgZGF0YSB0byBiZSBpbiBhIHByZXNlbmNlLWFic2VuY2UgZm9ybSwgdHlwaWNhbGx5IGFzIG1hdHJpeCB3aXRoIFNpdGUgYXMgYSBjb2x1bW4gc28gc3Vic2FtcGxlcyBjYW4gYmUgb3JnYW5pemVkIGFjY29yZGluZ2x5LiBSb3dzIGFyZSBuYW1lZCB1c2luZyBxdWFkcmF0IGNvZGVzIChwbG90LCB0cmFuc2VjdCwgcXVhZHJhdCkuDQoNCmBgYHtyIEthYmxlIDEsIGVjaG89RkFMU0V9DQpBbGxQb25kc1RyaW1tZWQ8LXNlbGVjdChBbGxQb25kcywgYygxOjcpKQ0Ka2FibGUoQWxsUG9uZHNUcmltbWVkWzE6NSwgXSwgZm9ybWF0ID0gInBhbmRvYyIsIGZ1bGxfd2lkdGg9RiwgY2FwdGlvbiA9ICdUYWJsZSAxLiBTYW1wbGUgb2YgZGF0YSBpbiBwcmVzZW5jZS1hYnNlbmNlIGZvcm1hdC4nKQ0KYGBgDQoNCiMjIyBSIExpYnJhcmllcyBVc2VkDQoNCioqQW5hbHlzZXMqKjxicj4NCi1pTkVYVCwgdmVnYW4sIG1jbHVzdCwgTXVNSW4sIGxtZTQNCg0KKipEaXNwbGF5L0RhdGEgV3JhbmdsaW5nKio8YnI+DQotZ2dwbG90MiwgZHBseXIsIHRpZHlyLCByZXNoYXBlLCBrbml0ciwga2FibGVFeHRyYSwgZ2dmb3J0aWZ5LCBnZ3B1YnIsIGNvbG9yZGlzdGFuY2UsIG90dVN1bW1hcnksIHN0cmluZ2ksIHN0cmluZ3IsIGdnZXh0cmEsIGdyaWRleHRyYQ0KDQoqKk1hcHBpbmcqKjxicj4NCi1nZW9zcGhlcmUsIHJnZGFsLCBnZ21hcA0KDQoqKkF3ZXNvbWVuZXNzKio8YnI+DQotYmVlcHIsIHdlc2FuZGVyc29uDQoNCi0tLS0tLQ0KDQojIyBSaWNobmVzcw0KDQpgYGB7ciBFc3QgYW5kIE9icyBSaWNobmVzcyBQbG90LCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdChSaWNoR2F0aCwgYWVzKHg9U2l0ZSwgeT12YWx1ZSwgY29sb3I9UmljaG5lc3MpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lYW4oUmljaEludHMkUmljaG5lc3NPYnMpLCBjb2xvcj0iYmxhY2siKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVhbihSaWNoSW50cyRSaWNobmVzc0V4cCksIGNvbG9yPSJkYXJrZ3JleSIpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImRhcmtncmV5IiwgImJsYWNrIikpKw0KICBnZW9tX3BvaW50KHNpemU9MikrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49UmljaExDTCwgeW1heD1SaWNoVUNMKSwgd2lkdGg9LjMsIGNvbG9yPSJkYXJrZ3JleSIpICsNCiAgeWxhYigiU3BlY2llcyBSaWNobmVzcyIpKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMjUwKSkrDQogIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTQpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpKSsgdGhlbWVfYncoKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPWMoMC4wMjUsLjkpLCBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDAsMSkpDQpgYGANCg0KU2l0ZXMgaGFkIHdpZGVseSB2YXJ5aW5nIG9ic2VydmVkIHRvdGFsIHJpY2huZXNzLiANCg0KIyMjIEV4dHJhcG9sYXRpb24gb2YgUmljaG5lc3MNCg0KVGhlIHVzZSBvZiBleHRyYXBvbGF0ZWQgc3BlY2llcyBhY2N1bXVsYXRpb24gY3VydmVzIGNhbiB0ZWxsIHVzIGhvdyBtYW55IHNwZWNpZXMgYXJlIGxpa2VseSB0byBiZSBhdCB0aGUgc2l0ZSBiYXNlZCBvbiBob3cgbWFueSB3ZXJlIGZvdW5kIGluIGFjY3VtdWxhdGluZyBzdWJzYW1wbGVzLiANCg0KYGBge3IgVW5pY29ybiB2b21pdCwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPVRSVUV9DQpnZ2lORVhUKG91dC5pbmMuYWxsLCB0eXBlPTEsIGNvbG9yLnZhcj0ic2l0ZSIpICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArDQogIHlsYWIoIlNwZWNpZXMgUmljaG5lc3MiKSArDQogIHhsYWIoIk51bWJlciBvZiBRdWFkcmF0cyIpICsNCiAgZ2d0aXRsZSgiSW50ZXJwb2xhdGVkIGFuZCBleHRyYXBvbGF0ZWQgcmljaG5lc3MiKSArDQogIGxhYnMoY2FwdGlvbj0iQj0xMDAwMC4iKQ0KYGBgDQoNClRoZXNlIGN1cnZlcyBpbGx1c3RyYXRlIG5vdCBvbmx5ICp3aGVyZSogdGhlIGZsYXR0ZW5pbmcgcG9pbnQgKGV4cGVjdGVkIHJpY2huZXNzKSBvY2N1cnMsIGJ1dCBhbHNvICpob3cgcXVpY2tseSouIEV4YW1pbmluZyBhIGN1cnZlIGNhbiBhbGxvdyBzb21lb25lIHRvIGVzdGltYXRlIGhvdyBtYW55IG1vcmUgc2FtcGxlcyB3b3VsZCBiZSBuZWVkZWQgdG8gcmVhY2ggdGhhdCBwb2ludCwgaG93ZXZlciBpZiBkb2luZyBzbyBzYW1wbGVzIGEgbGFyZ2VyIGFyZWEgdGhlbiB0aGUgY3VydmUgbWF5IG5ldmVyIGZsYXR0ZW4uIA0KDQojIyMgU2FtcGxpbmcgRWZmb3J0DQoNClNhbXBsaW5nIGVmZm9ydCAoIyBxdWFkcmF0cy9hcmVhIHNhbXBsZWQpIGRpZCBub3QgYWZmZWN0IHBlcmNlbnQgZXN0aW1hdGVkIHNhbXBsaW5nIGNvbXBsZXRpb24uDQoNCmBgYHtyIFNhbXBsaW5nIHN1ZmZpY2llbmN5LCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0NCmdncGxvdChSaWNoSW50cywgYWVzKHg9c2l0ZXNpemVzJFF1YWRzQXJlYSwgeT1QZXJjQ29tcGxldGUsIGNvbG9yPSJibGFjayIpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBjb2xvcj0iYmxhY2siKSsNCiAgZ2VvbV90ZXh0KGxhYmVsPVJpY2hJbnRzJFNpdGUsIGNvbG9yPSJibGFjayIsIHNpemU9MykrDQogIHlsYWIoIkVzdGltYXRlZCAlIFNwZWNpZXMgU2FtcGxlZCIpKw0KICB4bGFiKGV4cHJlc3Npb24oUXVhZHJhdHN+U2FtcGxlZC9TaXRlfkFyZWF+KG1eMikpKSsNCiAgZ2d0aXRsZSgiRXN0aW1hdGVkIHNhbXBsaW5nIGNvbXBsZXRpb24gZG9lcyBub3QgaW5jcmVhc2Ugd2l0aCBzYW1wbGluZyBlZmZvcnQiKSsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEwMCkpKw0KICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSkNCmBgYA0KDQpUaGVyZSBpcyBubyByZWxhdGlvbnNoaXAgYmV0d2VlbiBzYW1wbGluZyBlZmZvcnQgYW5kIGNvbXBsZXRpb24gcGVyY2VudGFnZSAoRj0gYHIgYVJpY2hRdWFkWzEsNF1gLCBwPWByIGFSaWNoUXVhZFsxLDVdYCkuIA0KDQpgYGB7ciBNb2RlbCBzZWxlY3Rpb24gcHJlcCwgaW5jbHVkZT1GQUxTRX0NClJpY2hTaXRlczwtY2JpbmQoc2l0ZXNpemVzLCBSaWNoSW50cykNClJpY2hTaXRlcy50IDwtIFJpY2hTaXRlc1sgLWMoMSkgXQ0KYGBgDQoNCiMjIyBNb2RlbCBTZWxlY3Rpb24NCg0KQSBuZWdhdGl2ZSBiaW5vbWlhbCBnZW5lcmFsaXplZCBsaW5lYXIgbW9kZWxzIHdhcyB1c2VkIGJlY2F1c2UgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIChyaWNobmVzcykgaXMgY291bnQgZGF0YSBhbmQgY2Fubm90IGJlIG5lZ2F0aXZlLiBNb2RlbHMgd2VyZSBtYWRlIHRvIGRldGVybWluZSB3aGljaCBjb21iaW5hdGlvbnMgb2YgdmFyaWFibGVzIGJlc3QgZXhwbGFpbmVkIGRpZmZlcmVuY2VzIGluIHNpdGUgcmljaG5lc3MuDQoNCmBgYHtyIE1vZGVsIFNlbGVjdGlvbiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm1vZGVsMTwtZ2xtKFJpY2huZXNzT2JzflBlcm1hbmVuY2UqU3RhcnREZXB0aCpEZXB0aENoYW5nZStHcmF6aW5nK0FyZWEsIGZhbWlseT0gcG9pc3NvbihsaW5rPWxvZyksIGRhdGE9IFJpY2hTaXRlcy50KQ0KI01vZGVsMSB3aXRob3V0IFN0YXJ0RGVwdGgNCm1vZGVsMjwtZ2xtKFJpY2huZXNzT2JzflBlcm1hbmVuY2UqRGVwdGhDaGFuZ2UrR3JhemluZytBcmVhLCBmYW1pbHk9IHBvaXNzb24obGluaz1sb2cpLCBkYXRhPSBSaWNoU2l0ZXMudCkNCiNNb2RlbDEgd2l0aG91dCBEZXB0aENoYW5nZQ0KbW9kZWwzPC1nbG0oUmljaG5lc3NPYnN+UGVybWFuZW5jZSpTdGFydERlcHRoK0dyYXppbmcrQXJlYSwgZmFtaWx5PSBwb2lzc29uKGxpbms9bG9nKSwgZGF0YT0gUmljaFNpdGVzLnQpDQojTW9kZWwxIHdpdGhvdXQgUGVybWFuZW5jZQ0KbW9kZWw0PC1nbG0oUmljaG5lc3NPYnN+U3RhcnREZXB0aCpEZXB0aENoYW5nZStHcmF6aW5nK0FyZWEsIGZhbWlseT0gcG9pc3NvbihsaW5rPWxvZyksIGRhdGE9IFJpY2hTaXRlcy50KQ0KI01vZGVsNCB3aXRob3V0IGludGVyYWN0aW9ucw0KbW9kZWw1PC1nbG0oUmljaG5lc3NPYnN+UGVybWFuZW5jZStTdGFydERlcHRoK0RlcHRoQ2hhbmdlK0dyYXppbmcrQXJlYSwgZmFtaWx5PSBwb2lzc29uKGxpbms9bG9nKSwgZGF0YT0gUmljaFNpdGVzLnQpDQojTW9kZWw0IHdpdGhvdXQgZ3JhemluZw0KbW9kZWw2PC1nbG0oUmljaG5lc3NPYnN+UGVybWFuZW5jZSpTdGFydERlcHRoKkRlcHRoQ2hhbmdlK0FyZWEsIGZhbWlseT0gcG9pc3NvbihsaW5rPWxvZyksIGRhdGE9IFJpY2hTaXRlcy50KQ0KI01vZGVsNCB3aXRob3V0IEFyZWENCm1vZGVsNzwtZ2xtKFJpY2huZXNzT2JzflBlcm1hbmVuY2UqU3RhcnREZXB0aCpEZXB0aENoYW5nZStHcmF6aW5nLCBmYW1pbHk9IHBvaXNzb24obGluaz1sb2cpLCBkYXRhPSBSaWNoU2l0ZXMudCkNCiNNb2RlbDQgd2l0aG91dCBHcmF6aW5nIG9yIEFyZWENCm1vZGVsODwtZ2xtKFJpY2huZXNzT2JzflBlcm1hbmVuY2UqU3RhcnREZXB0aCpEZXB0aENoYW5nZSwgZmFtaWx5PSBwb2lzc29uKGxpbms9bG9nKSwgZGF0YT0gUmljaFNpdGVzLnQsIG5hLmFjdGlvbiA9ICJuYS5mYWlsIikNCiNtb2RlbDggd2l0aG91dCB0aHJlZXdheQ0KbW9kZWw5PC1nbG0oUmljaG5lc3NPYnN+UGVybWFuZW5jZSpTdGFydERlcHRoK1N0YXJ0RGVwdGgqRGVwdGhDaGFuZ2UrRGVwdGhDaGFuZ2UqUGVybWFuZW5jZSwgZmFtaWx5PSBwb2lzc29uKGxpbms9bG9nKSwgZGF0YT1SaWNoU2l0ZXMudCkNCg0Kb3V0LnB1dGFsbDwtbW9kZWwuc2VsKG1vZGVsMSwgbW9kZWwyLCBtb2RlbDMsIG1vZGVsNCwgbW9kZWw1LCBtb2RlbDYsIG1vZGVsNywgbW9kZWw4LCBtb2RlbDkpIA0Kc2VsLnRhYmxleGE8LWFzLmRhdGEuZnJhbWUob3V0LnB1dGFsbClbMTE6MTVdDQpzZWwudGFibGV4YVssMjo0XTwtIHJvdW5kKHNlbC50YWJsZXhhWywyOjRdLDIpDQpzZWwudGFibGV4YVssNV08LSByb3VuZChzZWwudGFibGV4YVssNV0sMykNCm5hbWVzKHNlbC50YWJsZXhhKVsxXSA9ICJLIg0Kc2VsLnRhYmxleGEkTW9kZWw8LXJvd25hbWVzKHNlbC50YWJsZXhhKQ0KDQojOCw3LDYsNCwyLDMsNQ0Kc2VsLnRhYmxleGEkTW9kZWw8LWMoIlBlcm0gKiBTdHJ0RHB0aCAqIERwdGhDaG5nIiwiUGVybSAqIFN0cnREcHRoICogRHB0aENobmcgKyBHcnpuZyIsIlBlcm0gKiBTdHJ0RHB0aCAqIERwdGhDaG5nICsgQXJlYSIsICJQZXJtICogU3RydERwdGggKiBEcHRoQ2huZyArIEdyem5nICsgQXJlYSIsICJQZXJtICogU3RydERwdGggKyBTdHJ0RHB0aCAqIERwdGhDaG5nZSArIERwdGhDaG5nICogUGVybSIsICJTdHJ0RHB0aCAqIERwdGhDaG5nICsgR3J6bmcgKyBBcmVhIiwiUGVybSAqIERwdGhDaG5nICsgR3J6bmcgKyBBcmVhIiwiUGVybSAqIFN0cnREcHRoICsgR3J6bmcgKyBBcmVhIiwiUGVybSArIFN0cnREcHRoICsgRHB0aENobmcgKyBHcnpuZyArIEFyZWEiKQ0Kc2VsLnRhYmxlMnhhPC1zZWwudGFibGV4YVssYyg2LDEsMiwzLDQsNSldDQprYWJsZShzZWwudGFibGUyeGEsIGNhcHRpb249IkNvbXBhcmlzb24gb2YgbW9kZWxzLiIsIGZvcm1hdCA9ICJodG1sIiwgdGFibGUuYXR0ciA9ICJzdHlsZT0nd2lkdGg6MTAwJTsnIikNCmBgYA0KDQo8YnI+VGhlIGZ1bGx5IGNyb3NzZWQgbW9kZWwgb2YgcGVybWFuZW5jZSwgZWFybHkgc2Vhc29uIHdhdGVyIGRlcHRoLCBhbmQgZGVwdGggY2hhbmdlIGhhZCB0aGUgbW9zdCBleHBsYW5hdG9yeSBwb3dlciwgYnV0IGl0IGNvbnRhaW5zIG1hbnkgaW50ZXJhY3Rpb24gdGVybXMgYW5kIHNob3VsZCBiZSB0cmltbWVkIGRvd24gaWYgcG9zc2libGUuIA0KDQo8ZmlndXJlPg0KPGltZyBzcmM9IkltYWdlcy9lZGFwaGljY3JvcHBlZC5qcGciPjwvZmlndXJlPjxicj4NCg0KTW9kZWwgOCB3YXMgZHJlZGdlZCwgYnV0IHRoZSBtYXJrZG93biBmYWlsZWQgdG8ga25pdCB3aGVuIHRoaXMgd2FzIGluY2x1ZGVkLiBBIHNjcmVlbnNob3Qgb2YgdGhlIHJlc3VsdGluZyB0YWJsZSB3YXMgaW5jbHVkZWQgaW5zdGVhZC4gVmFyaWFibGVzIGFyZSBhYmJyZXZpYXRlZCBhcyBmb2xsb3dzOg0KDQpkYz0gZGVwdGggY2hhbmdlDQpwPSB3YXRlciBwZXJtYW5lbmNlDQpzZD0gZWFybHkgc2Vhc29uIHdhdGVyIGRlcHRoDQoNCjxmaWd1cmU+DQo8aW1nIHNyYz0iSW1hZ2VzL2RyZWRnZXkucG5nIj48L2ZpZ3VyZT48YnI+DQoNCg0KPGJyPlRoZSBmdWxseSBjcm9zc2VkIG1vZGVsIG9mIHBlcm1hbmVuY2UsIGVhcmx5IHNlYXNvbiB3YXRlciBkZXB0aCwgYW5kIGRlcHRoIGNoYW5nZSBzdGlsbCBoYWQgdGhlIG1vc3QgZXhwbGFuYXRvcnkgcG93ZXIuIFRoaXMgaW5jbHVkZXMgYSB0aHJlZSB3YXkgaW50ZXJhY3Rpb24sIHdoaWNoIHdpbGwgbWFrZSBpbnRlcnByZXRhdGlvbiBkaWZmaWN1bHQgYnV0ICppdCBpcyBiaW9sb2dpY2FsbHkgcmVsZXZhbnQqIHNvIGl0IHNob3VsZCBiZSBpbmNsdWRlZC4NCg0KLS0tLS0tDQoNCiMjIEJldGEgRGl2ZXJzaXR5DQoNCjxmaWd1cmU+DQo8aW1nIHNyYz0iSW1hZ2VzL0dvb3NlY3JvcHBlZC5qcGciPjwvZmlndXJlPjxicj4NCg0KQmV0YSBkaXZlcnNpdHkgaXMgYSBtZWFzdXJlIG9mIGNvbXBvc2l0aW9uYWwgc2ltaWxhcml0eSByYW5naW5nIGZyb20gMCAoc2l0ZXMgaGF2ZSB0aGUgc2FtZSBjb21wb3NpdGlvbikgdG8gMSAobm8gc3BlY2llcyBvdmVybGFwIGJldHdlZW4gc2l0ZXMpLiBUaGVyZSBhcmUgbXVsdGlwbGUgd2F5cyB0byBtZWFzdXJlIGJldGEgZGl2ZXJzaXR5OyBJIHVzZWQgU29yZW5zZW4ncyBEaXNzaW1pbGFyaXR5IEluZGV4IGJlY2F1c2UgSSBoYWQgYmluYXJ5IHByZXNlbmNlLWFic2VuY2UgZGF0YS4gQmV0YSBkaXZlcnNpdHkgaXMgY2FsY3VsYXRlZCBhcyBwYWlyd2lzZSBjb21wYXJpc29ucywgbWVhbmluZyB0aGF0IHRoZSBvdXRwdXQgaXMgaW4gbWF0cml4LWZvcm0uIFRoaXMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGludGVycHJldCBhcy1pcy4gV2VzIEFuZGVyc29uJ3Mgc3dlZXQgY29sb3JzIGNhbiBoZWxwLCBob3dldmVyLg0KDQpgYGB7ciBIZWF0bWFwLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmhlYXRtYXBDb2xvckRpc3RhbmNlKHNvcmVuc2VuQWxsLm0udCwgbWFpbiA9IE5VTEwsDQogIGNvbG9yUmFtcFBhbGV0dGUoYyh3ZXNfcGFsZXR0ZSgiWmlzc291MSIsIGMoMykpKSkoMjk5KSwgbWFyZ2lucyA9IGMoNSwgNSkpDQpgYGANCg0KIyMjIEdlb2dyYXBoaWMgRGlzdGFuY2UNCg0KYGBge3IgTWFudGVsLCBpbmNsdWRlPUZBTFNFfQ0KbWFudGVsKHNvcmVuc2VuLm0udCwgZGlzdGFuY2UubSwgbWV0aG9kPSJzcGVhcm1hbiIsIHBlcm11dGF0aW9ucyA9IDk5OTkpDQpgYGANCk9uZSBwb3B1bGFyIHByZWRpY3Rpb24gb2YgdGhlIFRoZW9yeSBvZiBJc2xhbmQgQmlvZ2VvZ3JhcGh5IChhbmQgb3RoZXJzKSBpcyB0aGF0IGl0IGlzIGVhc2llciBmb3IgaW5kaXZpZHVhbHMgdG8gZGlzcGVyc2Ugc2hvcnRlciBkaXN0YW5jZXMgYW5kIHRoaXMgcmVzdWx0cyBpbiBjbG9zZSBzaXRlcyBiZWluZyBtb3JlIHNpbWlsYXIgdGhhbiBvbmVzIGZhciBhcGFydC4gV2Ugd2lsbCB0ZXN0IHRoaXMgdXNpbmcgYSBNYW50ZWwgdGVzdCwgd2hpY2ggd2lsbCB0ZXN0IHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBiZXRhIGRpdmVyc2l0eSBtYXRyaXggYWJvdmUgYW5kIGEgZ2VvZ3JhcGhpYyBkaXN0YW5jZSBtYXRyaXguIEkgaGFkIHRoZSB0ZXN0IHVzZSBTcGVhcm1hbidzIHJhbmsgY29ycmVsYXRpb24sIHdoaWNoIGlzIHRoZSBub25wYXJhbWV0cmljIHZlcnNpb24gb2YgdGhlIHRlc3QgYmVjYXVzZSB0aGUgZGF0YSBhcmVuJ3Qgbm9ybWFsLiBUaGlzIHRlc3QgZm91bmQgdGhhdCBnZW9ncmFwaGljIGRpc3RhbmNlIGFuZCBzcGVjaWVzIHNpbWlsYXJpdHkgYXJlIG5vdCBjb3JyZWxhdGVkIChyfm1+PSAwLjc1MyxwPSAwLjEzOSkuDQoNCmBgYHtyIENsdXN0ZXIgQW5hbHlzZXMsIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpCSUM8LW1jbHVzdEJJQyhzb3JlbnNlbkFsbC5tLnQpDQpwbG90KEJJQykNCmNsdXN0ZXI8LShoY2x1c3Qoc29yZW5zZW5BTEwpKQ0KZ3JwPC1jdXRyZWUoY2x1c3Rlciwgaz01KQ0KYGBgDQoNCmBgYHtyIERlbmRyb2dyYW0gd2l0aCBjbHVzdGVycywgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnBsb3QoY2x1c3RlciwgY2V4ID0gMC42LCB4bGFiID0gIlBsb3QgQ2x1c3RlcnMsIFNpbmdsZXRvbnMgYW5kIERvdWJsZXRvbnMgSW5jbHVkZWQiKQ0KcmVjdC5oY2x1c3QoY2x1c3RlciwgayA9IDUsIGJvcmRlciA9ICJibGFjayIpDQoNCmBgYA0KDQpgYGB7ciBTdWJjbHVzdGVyIGF0dGVtcHRzLCBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBjbHVzdGVyMTwtKHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIGdyZXBsKCcyMnwyN3wyNHw2fDE0JywgU2l0ZSkpLCAtMSkpDQojIGNsdXN0ZXIyPC0oc2VsZWN0KGZpbHRlcihBbGxQb25kcywgZ3JlcGwoJzEwfDd8NXw5JywgU2l0ZSkpLCAtMSkpDQojIGNsdXN0ZXIzPC0oc2VsZWN0KGZpbHRlcihBbGxQb25kcywgZ3JlcGwoJzEzfDE3fDI1fDI2JywgU2l0ZSkpLCAtMSkpDQojIGNsdXN0ZXI0PC0oc2VsZWN0KGZpbHRlcihBbGxQb25kcywgZ3JlcGwoJzF8MnwxNnwyMHwyMScsIFNpdGUpKSwgLTEpKQ0KIyBjbHVzdGVyNTwtKHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIGdyZXBsKCc4fDE4fDIzfDE4fDN8NHwxMXwxMicsIFNpdGUpKSwgLTEpKQ0KIyANCiMgY2x1c3RlcjEkc3VtPC1yb3dTdW1zKGNsdXN0ZXIxKQ0KIyBjbHVzdGVyMS4wPC1zZWxlY3QoZmlsdGVyKGNsdXN0ZXIxLCBzdW0gPiAwKSwgLTQxNykNCiMgY2x1c3RlcjIkc3VtPC1yb3dTdW1zKGNsdXN0ZXIyKQ0KIyBjbHVzdGVyMi4wPC1zZWxlY3QoZmlsdGVyKGNsdXN0ZXIyLCBzdW0gPiAwKSwgLTQxNykNCiMgY2x1c3RlcjMkc3VtPC1yb3dTdW1zKGNsdXN0ZXIzKQ0KIyBjbHVzdGVyMy4wPC1zZWxlY3QoZmlsdGVyKGNsdXN0ZXIzLCBzdW0gPiAwKSwgLTQxNykNCiMgY2x1c3RlcjQkc3VtPC1yb3dTdW1zKGNsdXN0ZXI0KQ0KIyBjbHVzdGVyNC4wPC1zZWxlY3QoZmlsdGVyKGNsdXN0ZXI0LCBzdW0gPiAwKSwgLTQxNykNCiMgY2x1c3RlcjUkc3VtPC1yb3dTdW1zKGNsdXN0ZXI1KQ0KIyBjbHVzdGVyNS4wPC1zZWxlY3QoZmlsdGVyKGNsdXN0ZXI1LCBzdW0gPiAwKSwgLTQxNykNCiMgDQojIHNvcmVuc2VuYzE8LXZlZ2Rpc3QoY2x1c3RlcjEuMCwgbWV0aG9kPSJicmF5IiwgYmluYXJ5PVRSVUUsIGRpYWc9VFJVRSwgdXBwZXI9RkFMU0UsIG5hLnJtID0gRkFMU0UpDQojIHNvcmVuc2VuYzEubS50PC1hcy5tYXRyaXgoc29yZW5zZW5jMSkNCiMgDQojIHNvcmVuc2VuYzI8LXZlZ2Rpc3QoY2x1c3RlcjIuMCwgbWV0aG9kPSJicmF5IiwgYmluYXJ5PVRSVUUsIGRpYWc9VFJVRSwgdXBwZXI9RkFMU0UsIG5hLnJtID0gRkFMU0UpDQojIHNvcmVuc2VuYzIubS50PC1hcy5tYXRyaXgoc29yZW5zZW5jMikNCiMgDQojIHNvcmVuc2VuYzM8LXZlZ2Rpc3QoY2x1c3RlcjMuMCwgbWV0aG9kPSJicmF5IiwgYmluYXJ5PVRSVUUsIGRpYWc9VFJVRSwgdXBwZXI9RkFMU0UsIG5hLnJtID0gRkFMU0UpDQojIHNvcmVuc2VuYzMubS50PC1hcy5tYXRyaXgoc29yZW5zZW5jMykNCiMgDQojIHNvcmVuc2VuYzQ8LXZlZ2Rpc3QoY2x1c3RlcjQuMCwgbWV0aG9kPSJicmF5IiwgYmluYXJ5PVRSVUUsIGRpYWc9VFJVRSwgdXBwZXI9RkFMU0UsIG5hLnJtID0gRkFMU0UpDQojIHNvcmVuc2VuYzQubS50PC1hcy5tYXRyaXgoc29yZW5zZW5jNCkNCiMgDQojIHNvcmVuc2VuYzU8LXZlZ2Rpc3QoY2x1c3RlcjUuMCwgbWV0aG9kPSJicmF5IiwgYmluYXJ5PVRSVUUsIGRpYWc9VFJVRSwgdXBwZXI9RkFMU0UsIG5hLnJtID0gRkFMU0UpDQojIHNvcmVuc2VuYzUubS50PC1hcy5tYXRyaXgoc29yZW5zZW5jNSkNCiMgDQojIEJJQzE8LW1jbHVzdEJJQyhzb3JlbnNlbmMxLm0udCkNCiMgQklDMjwtbWNsdXN0QklDKHNvcmVuc2VuYzIubS50KQ0KIyBCSUMzPC1tY2x1c3RCSUMoc29yZW5zZW5jMy5tLnQpDQojIEJJQzQ8LW1jbHVzdEJJQyhzb3JlbnNlbmM0Lm0udCkNCiMgQklDNTwtbWNsdXN0QklDKHNvcmVuc2VuYzUubS50KQ0KIyBwbG90KEJJQzIpDQojIA0KIyByZGExPC1yZGEoY2x1c3RlcjUuMCkNCiMgYmlwbG90KHJkYTEsDQojICAgICAgICBkaXNwbGF5PWMoInNpdGVzIiwgInNwZWNpZXMiKSwNCiMgICAgICAgIHR5cGU9YygidGV4dCIsICJwb2ludHMiKSkNCmBgYA0KDQojIyMgU2l0ZSBWYXJpYWJsZXMNCg0KQSBQZXJNQU5PVkEgKFBlcm11dGF0aW9uYWwgTXVsdGl2YXJpYXRlIEFuYWx5c2lzIE9mIFZhcmlhbmNlKSBpcyBhIG5vbnBhcmFtZXRyaWMgdGVzdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVjdCB3aGV0aGVyIHRoZSBtZWFzdXJlZCB2YXJpYWJsZXMgc2lnbmlmaWNhbnRseSBpbmZsdWVuY2UgYmV0YSBkaXZlcnNpdHkuIFRoZSBzeW50YXggb2YgdGhpcyBpcyBzaW1pbGFyIHRvIGEgR0xNLCB0aG91Z2ggaW5zdGVhZCBvZiBhIHJlc3BvbnNlIHZhcmlhYmxlIHlvdSB1c2UgYSByZXNwb25zZSBtYXRyaXguIA0KDQpgYGB7ciBQZXJNQU5PVkEsIGVjaG89RkFMU0V9DQpzdW1zdW1zeDwtc2xpY2Uoc3Vtc3VtcywgLWMoMSkpDQoNCnN1bXN1bXN2YXJzPC1jYmluZChzdW1zdW1zeCwgc2l0ZXNpemVzJFBlcm1hbmVuY2UsIHNpdGVzaXplcyRFbmREZXB0aCwgc2l0ZXNpemVzJFN0YXJ0RGVwdGgsIHNpdGVzaXplcyREZXB0aENoYW5nZSwgc2l0ZXNpemVzJEdyYXppbmcsIHNpdGVzaXplcyRBcmVhLCBzaXRlc2l6ZXMkU2l0ZSkNCmNvbG5hbWVzKHN1bXN1bXN2YXJzKVtjb2xuYW1lcyhzdW1zdW1zdmFycyk9PSJzaXRlc2l6ZXMkUGVybWFuZW5jZSJdIDwtICJQZXJtYW5lbmNlIg0KY29sbmFtZXMoc3Vtc3Vtc3ZhcnMpW2NvbG5hbWVzKHN1bXN1bXN2YXJzKT09InNpdGVzaXplcyRFbmREZXB0aCJdIDwtICJFbmREZXB0aCINCmNvbG5hbWVzKHN1bXN1bXN2YXJzKVtjb2xuYW1lcyhzdW1zdW1zdmFycyk9PSJzaXRlc2l6ZXMkU3RhcnREZXB0aCJdIDwtICJTdGFydERlcHRoIg0KY29sbmFtZXMoc3Vtc3Vtc3ZhcnMpW2NvbG5hbWVzKHN1bXN1bXN2YXJzKT09InNpdGVzaXplcyREZXB0aENoYW5nZSJdIDwtICJEZXB0aENoYW5nZSINCmNvbG5hbWVzKHN1bXN1bXN2YXJzKVtjb2xuYW1lcyhzdW1zdW1zdmFycyk9PSJzaXRlc2l6ZXMkR3JhemluZyJdIDwtICJHcmF6aW5nIg0KY29sbmFtZXMoc3Vtc3Vtc3ZhcnMpW2NvbG5hbWVzKHN1bXN1bXN2YXJzKT09InNpdGVzaXplcyRBcmVhIl0gPC0gIkFyZWEiDQpjb2xuYW1lcyhzdW1zdW1zdmFycylbY29sbmFtZXMoc3Vtc3Vtc3ZhcnMpPT0ic2l0ZXNpemVzJFNpdGUiXSA8LSAiU2l0ZSINCg0KYWRkeTE8LWFkb25pcyhzdW1zdW1zdmFyc1ssMTo0MTZdflBlcm1hbmVuY2UqU3RhcnREZXB0aCpEZXB0aENoYW5nZStHcmF6aW5nK0FyZWEsIGRhdGE9c3Vtc3Vtc3ZhcnMsIG1ldGhvZD0iYnJheSIsIGJpbmFyeT1UUlVFLCBwZXJtdXRhdGlvbnM9OTk5OSkNCg0KYWRkeTI8LWFzLmRhdGEuZnJhbWUoY2JpbmQoYWRkeTEkYW92LnRhYikpDQphZGR5Mjwtcm91bmQoYWRkeTIsIDMpDQprYWJsZShhZGR5MiwgY2FwdGlvbj0iRWZmZWN0IG9mIHZhcmlhYmxlcyBvbiBiZXRhIGRpdmVyc2l0eS4gQj05OTk5LiBUaGUgc3VtIHJeMiBvZiB0aGUgdmFyaWFibGVzIGFjY291bnRlZCBmb3IgYnkgdGhlIG1vZGVsIGlzIDAuNDU5LiAiLCBmb3JtYXQgPSAiaHRtbCIsIHRhYmxlLmF0dHIgPSAic3R5bGU9J3dpZHRoOjEwMCU7JyIpDQpgYGANCjxicj4NCkl0IGlzIGRpZmZpY3VsdCB0byB2aXN1YWxpemUgdGhlIHRyZW5kcyBmcm9tIHRoZSBQZXJNQU5PVkEgcmVzdWx0cyBhbG9uZSwgc28gdGhleSB3ZXJlIGVhY2ggcGxvdHRlZCBieSB2YXJpYWJsZS4gQW4gT0xTIHJlZ3Jlc3Npb24gbGluZSB3YXMgYWRkZWQgdG8gY29udGludW91cyB2YXJpYWJsZXMgdG8gZ2V0IGEgZmVlbCBmb3IgdGhlIGdlbmVyYWwgdHJlbmQsIGJ1dCByZW1lbWJlcjogdGhlc2UgYXJlIG5vdCBsaW5lYXIgcmVsYXRpb25zaGlwcyEgDQoNClRoZSBjb2xvcmF0aW9uIG9mIHRoZSBwb2ludHMgY29ycmVzcG9uZHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBSYXVwLUNyaWNrIHZhbHVlLiBUaGlzIHZhbHVlIGlzIHRoZSBwZXJtdXRhdGVkIHByb2JhYmlsaXR5IHRoYXQgdGhlIGJldGEgZGl2ZXJzaXR5IHdhcyB0aGUgcmVzdWx0IG9mIGRldGVybWluaXN0aWMgKG5vbi1yYW5kb20pIHByb2Nlc3Nlcy4gDQo8YnI+DQpgYGB7ciBTcGxpdCBzdW1zdW1zIGJ5IHZhciwgaW5jbHVkZT1GQUxTRX0NCmVudmlyby52YXJzPC1jYmluZChzdW1zdW1zdmFyc1ssNDE3OjQyM10pDQoNCnN1bXNwZXJtPC1jb2xTdW1zKHN1bXBlcm0pDQpzdW1zZ3JhejwtY29sU3VtcyhzdW1ncmF6KQ0KDQpzdW1zdW1zcGVybTwtcmJpbmQoc3Vtc3Blcm0sIHN1bXBlcm0pDQpzdW1zdW1zZ3JhejwtcmJpbmQoc3Vtc2dyYXosIHN1bWdyYXopDQoNCnNvcmV5cGVybTwtdmVnZGlzdChzbGljZShzdW1zdW1zcGVybSwgLWMoMSkpLCBtZXRob2Q9ImJyYXkiLCBiaW5hcnk9VFJVRSwgZGlhZz1UUlVFLCB1cHBlcj1GQUxTRSwgbmEucm0gPSBGQUxTRSkNCnNvcmV5cGVybS5tdHg8LWFzLm1hdHJpeChzb3JleXBlcm0pDQpyb3duYW1lcyhzb3JleXBlcm0ubXR4KTwtYygidGVtcDEiLCAidGVtcDIiLCAicGVybTMiLCAicGVybTQiLCAicGVybTUiLCAicGVybTYiLCAicGVybTciLCAicGVybTgiLCAicGVybTkiLCAicGVybTEwIiwgInBlcm0xMSIsICJwZXJtMTIiLCAicGVybTEzIiwgInBlcm0xNCIsICJ0ZW1wMTYiLCAicGVybTE3IiwgInBlcm0xOCIsICJ0ZW1wMTkiLCAicGVybTIwIiwgInRlbXAyMSIsICJwZXJtMjIiLCAicGVybTIzIiwgInRlbXAyNCIsICJ0ZW1wMjUiLCAidGVtcDI2IiwgInBlcm0yNyIsICJ0ZW1wMjgiKQ0KY29sbmFtZXMoc29yZXlwZXJtLm10eCk8LWMoInRlbXAxIiwgInRlbXAyIiwgInBlcm0zIiwgInBlcm00IiwgInBlcm01IiwgInBlcm02IiwgInBlcm03IiwgInBlcm04IiwgInBlcm05IiwgInBlcm0xMCIsICJwZXJtMTEiLCAicGVybTEyIiwgInBlcm0xMyIsICJwZXJtMTQiLCAidGVtcDE2IiwgInBlcm0xNyIsICJwZXJtMTgiLCAidGVtcDE5IiwgInBlcm0yMCIsICJ0ZW1wMjEiLCAicGVybTIyIiwgInBlcm0yMyIsICJ0ZW1wMjQiLCAidGVtcDI1IiwgInRlbXAyNiIsICJwZXJtMjciLCAidGVtcDI4IikNCg0KDQpzb3JleWdyYXo8LXZlZ2Rpc3Qoc2xpY2Uoc3Vtc3Vtc2dyYXosIC1jKDEpKSwgbWV0aG9kPSJicmF5IiwgYmluYXJ5PVRSVUUsIGRpYWc9VFJVRSwgdXBwZXI9RkFMU0UsIG5hLnJtID0gRkFMU0UpDQpzb3JleWdyYXoubXR4PC1hcy5tYXRyaXgoc29yZXlncmF6KQ0Kcm93bmFtZXMoc29yZXlncmF6Lm10eCk8LWMoIm5vMSIsICJubzIiLCAibm8zIiwgIm5vNCIsICJncmF6NSIsICJubzYiLCAiZ3JhejciLCAibm84IiwgImdyYXo5IiwgImdyYXoxMCIsICJubzExIiwgIm5vMTIiLCAiZ3JhejEzIiwgIm5vMTQiLCAibm8xNiIsICJncmF6MTciLCAibm8xOCIsICJubzE5IiwgIm5vMjAiLCAibm8yMSIsICJubzIyIiwgIm5vMjMiLCAibm8yNCIsICJubzI1IiwgIm5vMjYiLCAibm8yNyIsICJubzI4IikNCmNvbG5hbWVzKHNvcmV5Z3Jhei5tdHgpPC1jKCJubzEiLCAibm8yIiwgIm5vMyIsICJubzQiLCAiZ3JhejUiLCAibm82IiwgImdyYXo3IiwgIm5vOCIsICJncmF6OSIsICJncmF6MTAiLCAibm8xMSIsICJubzEyIiwgImdyYXoxMyIsICJubzE0IiwgIm5vMTYiLCAiZ3JhejE3IiwgIm5vMTgiLCAibm8xOSIsICJubzIwIiwgIm5vMjEiLCAibm8yMiIsICJubzIzIiwgIm5vMjQiLCAibm8yNSIsICJubzI2IiwgIm5vMjciLCAibm8yOCIpDQoNCnNvcmV5cGVybS5tPC1tYXRyaXhDb252ZXJ0KHNvcmV5cGVybS5tdHgsIGNvbG5hbWUgPSBjKCJzaXRlQUEiLCAic2l0ZUJCIiwgInNvcmVuc2VuIikpDQoNCiNyZW1vdmUgc2l0ZSBudW1iZXJzIGFuZCBjb25jYXRlbmF0ZSBpbnRvIHRyZWF0bWVudCBjb21ib3MNCnBlcm1zaXRlQUE8LXVubGlzdChzdHJpX2V4dHJhY3RfYWxsX3JlZ2V4KHNvcmV5cGVybS5tJHNpdGVBQSwgIlthLXpdKyIpKQ0KcGVybXNpdGVCQjwtdW5saXN0KHN0cmlfZXh0cmFjdF9hbGxfcmVnZXgoc29yZXlwZXJtLm0kc2l0ZUJCLCAiW2Etel0rIikpDQpzb3JleXBlcm0ubSRwZXJtIDwtIHBhc3RlKHBlcm1zaXRlQUEscGVybXNpdGVCQikNCnNvcmV5cGVybS5tJHBlcm08LXN0cl9yZXBsYWNlKHNvcmV5cGVybS5tJHBlcm0sICJ0ZW1wIHBlcm0iLCAicGVybSB0ZW1wIikNCiNtYWtlIGZpbmFsIHZhcmlhYmxlIG5hbWVzIGZvciBwbG90cw0Kc29yZXlwZXJtLm0kcGVybTwtc3RyX3JlcGxhY2Uoc29yZXlwZXJtLm0kcGVybSwgInBlcm0gdGVtcCIsICJwL3QiKQ0Kc29yZXlwZXJtLm0kcGVybTwtc3RyX3JlcGxhY2Uoc29yZXlwZXJtLm0kcGVybSwgInRlbXAgdGVtcCIsICJ0L3QiKQ0Kc29yZXlwZXJtLm0kcGVybTwtc3RyX3JlcGxhY2Uoc29yZXlwZXJtLm0kcGVybSwgInBlcm0gcGVybSIsICJwL3AiKQ0KDQojIHBlcm1wZXJtLnI8LWZpbHRlcihyYXVweXBlcm0ubSwgcGVybSA9PSAicGVybSBwZXJtIikNCiMgcGVybXRlbXAucjwtZmlsdGVyKHJhdXB5cGVybS5tLCBwZXJtID09ICJwZXJtIHRlbXAiKQ0KIyB0ZW1wdGVtcC5yPC1maWx0ZXIocmF1cHlwZXJtLm0sIHBlcm0gPT0gInRlbXAgdGVtcCIpDQoNCnNvcmV5Z3Jhei5tPC1tYXRyaXhDb252ZXJ0KHNvcmV5Z3Jhei5tdHgsIGNvbG5hbWUgPSBjKCJzaXRlQUEiLCAic2l0ZUJCIiwgInNvcmVuc2VuIikpDQoNCmdyYXpzaXRlQUE8LXVubGlzdChzdHJpX2V4dHJhY3RfYWxsX3JlZ2V4KHNvcmV5Z3Jhei5tJHNpdGVBQSwgIlthLXpdKyIpKQ0KZ3JhenNpdGVCQjwtdW5saXN0KHN0cmlfZXh0cmFjdF9hbGxfcmVnZXgoc29yZXlncmF6Lm0kc2l0ZUJCLCAiW2Etel0rIikpDQpzb3JleWdyYXoubSRncmF6IDwtIHBhc3RlKGdyYXpzaXRlQUEsZ3JhenNpdGVCQikNCnNvcmV5Z3Jhei5tJGdyYXo8LXN0cl9yZXBsYWNlKHNvcmV5Z3Jhei5tJGdyYXosICJubyBncmF6IiwgImdyYXogbm8iKQ0KDQpzb3JleWdyYXoubSRncmF6PC1zdHJfcmVwbGFjZShzb3JleWdyYXoubSRncmF6LCAiZ3JheiBubyIsICIrLy0iKQ0Kc29yZXlncmF6Lm0kZ3Jhejwtc3RyX3JlcGxhY2Uoc29yZXlncmF6Lm0kZ3JheiwgImdyYXogZ3JheiIsICIrLysiKQ0Kc29yZXlncmF6Lm0kZ3Jhejwtc3RyX3JlcGxhY2Uoc29yZXlncmF6Lm0kZ3JheiwgIm5vIG5vIiwgIi0vLSIpDQoNCnZhYWFzdGFydGRlcHRoPC1hcy5tYXRyaXgoZGlzdChlbnZpcm8udmFycyRTdGFydERlcHRoKSkNCnZhYWFkZXB0aGNoYW5nZTwtYXMubWF0cml4KGRpc3QoZW52aXJvLnZhcnMkRGVwdGhDaGFuZ2UpKQ0KdmFhYWFyZWE8LWFzLm1hdHJpeChkaXN0KGVudmlyby52YXJzJEFyZWEpKQ0KDQpzdGFydGRlcHRoLm08LW1hdHJpeENvbnZlcnQodmFhYXN0YXJ0ZGVwdGgsIGNvbG5hbWUgPSBjKCJzaXRlQSIsICJzaXRlQiIsICJzdGFydGRlcHRoIikpDQpkZXB0aGNoYW5nZS5tPC1tYXRyaXhDb252ZXJ0KHZhYWFkZXB0aGNoYW5nZSwgY29sbmFtZSA9IGMoInNpdGVBIiwgInNpdGVCIiwgImRlcHRoY2hhbmdlIikpDQphcmVhLm08LW1hdHJpeENvbnZlcnQodmFhYWFyZWEsIGNvbG5hbWUgPSBjKCJzaXRlQSIsICJzaXRlQiIsICJhcmVhIikpDQoNCmFsbHNvcmV5PC1hcy5kYXRhLmZyYW1lKGNiaW5kKHNvcmV5Z3Jhei5tJHNvcmVuc2VuLCBzb3JleWdyYXoubSRncmF6LCBzb3JleXBlcm0ubSRwZXJtLCBzdGFydGRlcHRoLm0kc3RhcnRkZXB0aCwgZGVwdGhjaGFuZ2UubSRkZXB0aGNoYW5nZSwgYXJlYS5tJGFyZWEpKQ0KbmFtZXMoYWxsc29yZXkpPC1jKCJzb3JlbnNlbiIsICJncmF6IiwgInBlcm0iLCAic3RhcnRkZXB0aCIsICJkZXB0aGNoYW5nZSIsICJhcmVhIikNCmBgYA0KDQpgYGB7ciBSYXVweSB5ZWUgaGF3LCBpbmNsdWRlPUZBTFNFfQ0KcmF1cHl2ZWdhbjwtcmF1cGNyaWNrKHN1bW1hcnkpDQoNCnJhdXB5cGVybTwtcmF1cGNyaWNrKHN1bXBlcm0pDQpyYXVweXBlcm0ubTwtbWF0cml4Q29udmVydChyYXVweXBlcm0sIGNvbG5hbWUgPSBjKCJzaXRlQSIsICJzaXRlQiIsICJyYXVwY3JpY2siKSkNCg0KI3JlbW92ZSBzaXRlIG51bWJlcnMgYW5kIGNvbmNhdGVuYXRlIGludG8gdHJlYXRtZW50IGNvbWJvcw0KcGVybXNpdGVBPC11bmxpc3Qoc3RyaV9leHRyYWN0X2FsbF9yZWdleChyYXVweXBlcm0ubSRzaXRlQSwgIlthLXpdKyIpKQ0KcGVybXNpdGVCPC11bmxpc3Qoc3RyaV9leHRyYWN0X2FsbF9yZWdleChyYXVweXBlcm0ubSRzaXRlQiwgIlthLXpdKyIpKQ0KcmF1cHlwZXJtLm0kcGVybSA8LSBwYXN0ZShwZXJtc2l0ZUEscGVybXNpdGVCKQ0KcmF1cHlwZXJtLm0kcGVybTwtc3RyX3JlcGxhY2UocmF1cHlwZXJtLm0kcGVybSwgInRlbXAgcGVybSIsICJwZXJtIHRlbXAiKQ0KI21ha2UgZmluYWwgdmFyaWFibGUgbmFtZXMgZm9yIHBsb3RzDQpyYXVweXBlcm0ubSRwZXJtPC1zdHJfcmVwbGFjZShyYXVweXBlcm0ubSRwZXJtLCAicGVybSB0ZW1wIiwgInAvdCIpDQpyYXVweXBlcm0ubSRwZXJtPC1zdHJfcmVwbGFjZShyYXVweXBlcm0ubSRwZXJtLCAidGVtcCB0ZW1wIiwgInQvdCIpDQpyYXVweXBlcm0ubSRwZXJtPC1zdHJfcmVwbGFjZShyYXVweXBlcm0ubSRwZXJtLCAicGVybSBwZXJtIiwgInAvcCIpDQoNCg0KIyBwZXJtcGVybS5yPC1maWx0ZXIocmF1cHlwZXJtLm0sIHBlcm0gPT0gInBlcm0gcGVybSIpDQojIHBlcm10ZW1wLnI8LWZpbHRlcihyYXVweXBlcm0ubSwgcGVybSA9PSAicGVybSB0ZW1wIikNCiMgdGVtcHRlbXAucjwtZmlsdGVyKHJhdXB5cGVybS5tLCBwZXJtID09ICJ0ZW1wIHRlbXAiKQ0KDQpyYXVweWdyYXo8LXJhdXBjcmljayhzdW1ncmF6KQ0KcmF1cHlncmF6Lm08LW1hdHJpeENvbnZlcnQocmF1cHlncmF6LCBjb2xuYW1lID0gYygic2l0ZUEiLCAic2l0ZUIiLCAicmF1cGNyaWNrIikpDQoNCmdyYXpzaXRlQTwtdW5saXN0KHN0cmlfZXh0cmFjdF9hbGxfcmVnZXgocmF1cHlncmF6Lm0kc2l0ZUEsICJbYS16XSsiKSkNCmdyYXpzaXRlQjwtdW5saXN0KHN0cmlfZXh0cmFjdF9hbGxfcmVnZXgocmF1cHlncmF6Lm0kc2l0ZUIsICJbYS16XSsiKSkNCnJhdXB5Z3Jhei5tJGdyYXogPC0gcGFzdGUoZ3JhenNpdGVBLGdyYXpzaXRlQikNCnJhdXB5Z3Jhei5tJGdyYXo8LXN0cl9yZXBsYWNlKHJhdXB5Z3Jhei5tJGdyYXosICJubyBncmF6IiwgImdyYXogbm8iKQ0KDQpyYXVweWdyYXoubSRncmF6PC1zdHJfcmVwbGFjZShyYXVweWdyYXoubSRncmF6LCAiZ3JheiBubyIsICIrLy0iKQ0KcmF1cHlncmF6Lm0kZ3Jhejwtc3RyX3JlcGxhY2UocmF1cHlncmF6Lm0kZ3JheiwgImdyYXogZ3JheiIsICIrLysiKQ0KcmF1cHlncmF6Lm0kZ3Jhejwtc3RyX3JlcGxhY2UocmF1cHlncmF6Lm0kZ3JheiwgIm5vIG5vIiwgIi0vLSIpDQoNCmFsbHJhdXB5PC1hcy5kYXRhLmZyYW1lKGNiaW5kKHJhdXB5Z3Jhei5tJHJhdXBjcmljaywgcmF1cHlncmF6Lm0kZ3JheiwgcmF1cHlwZXJtLm0kcGVybSwgc3RhcnRkZXB0aC5tJHN0YXJ0ZGVwdGgsIGRlcHRoY2hhbmdlLm0kZGVwdGhjaGFuZ2UsIGFyZWEubSRhcmVhKSkNCm5hbWVzKGFsbHJhdXB5KTwtYygicmF1cGNyaWNrIiwgImdyYXoiLCAicGVybSIsICJzdGFydGRlcHRoIiwgImRlcHRoY2hhbmdlIiwgImFyZWEiKQ0KDQphbGxyYXVweSRyYXVwY3JpY2sgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYWxscmF1cHkkcmF1cGNyaWNrKSkNCmFsbHJhdXB5JGFyZWEgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYWxscmF1cHkkYXJlYSkpDQphbGxyYXVweSRzdGFydGRlcHRoIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGFsbHJhdXB5JHN0YXJ0ZGVwdGgpKQ0KYWxscmF1cHkkZGVwdGhjaGFuZ2UgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYWxscmF1cHkkZGVwdGhjaGFuZ2UpKQ0KDQphbGxzb3JleSRzb3JlbnNlbiA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihhbGxzb3JleSRzb3JlbnNlbikpDQphbGxzb3JleSRhcmVhIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGFsbHNvcmV5JGFyZWEpKQ0KYWxsc29yZXkkc3RhcnRkZXB0aCA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihhbGxzb3JleSRzdGFydGRlcHRoKSkNCmFsbHNvcmV5JGRlcHRoY2hhbmdlIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGFsbHNvcmV5JGRlcHRoY2hhbmdlKSkNCmBgYA0KDQpgYGB7ciBCcnVjZSBTT1JFWSBwbG90cywgZWNobz1GQUxTRX0NCnBhbCA8LSB3ZXNfcGFsZXR0ZSgiWmlzc291MSIsIDIxLCB0eXBlID0gImNvbnRpbnVvdXMiKQ0KDQpnZ3Blcm0yPC1nZ3Bsb3QoZGF0YT1hbGxzb3JleSwgYWVzKHg9cGVybSwgeT1zb3JlbnNlbixjb2xvcj1hbGxyYXVweSRyYXVwY3JpY2spKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gMC4zLCBoZWlnaHQgPSAwLjAsYWxwaGEgPSAwLjUpKw0KICBsYWJzKHg9IlBlcm1hbmVuY2UiLCB5ID0gIlNvcmVuc2VuIEluZGV4IikrDQogIGdlb21fYm94cGxvdChhbHBoYSA9IDAuMCkrDQogIHRoZW1lX2J3KCkrDQogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gcGFsKSsNCiAgbGFicyhjb2xvciA9ICJSYXVwIENyaWNrIikrIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKDEuNCwgMC41KSkNCg0KZ2dncmF6MjwtZ2dwbG90KGRhdGE9YWxsc29yZXksIGFlcyh4PWdyYXosIHk9c29yZW5zZW4sIGNvbG9yPWFsbHJhdXB5JHJhdXBjcmljaykpICsNCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjMsIGhlaWdodCA9IDAuMCxhbHBoYSA9IDAuNSkrDQogIGxhYnMoeD0iR3JhemluZyIsIHkgPSAiU29yZW5zZW4gSW5kZXgiKSsNCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gMC4wKSsNCiAgdGhlbWVfYncoKSsNCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBwYWwpKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikNCg0KZ2dhcmVhMjwtZ2dwbG90KGFsbHNvcmV5LCBhZXMoeD1hcmVhLCB5PXNvcmVuc2VuLCBjb2xvcj1hbGxyYXVweSRyYXVwY3JpY2spKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpKw0KICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIGNvbG91cj0iYmxhY2siKSsNCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBwYWwpKw0KICB0aGVtZV9idygpKw0KICB5bGFiKCJTb3JlbnNlbiBJbmRleCIpKw0KICB4bGFiKGV4cHJlc3Npb24oU2l0ZX5BcmVhfihtXjIpKSkrIA0KICBsYWJzKGNvbG9yID0gIlJhdXAgQ3JpY2siKSsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpDQoNCmdnc2QyPC1nZ3Bsb3QoYWxsc29yZXksIGFlcyh4PXN0YXJ0ZGVwdGgsIHk9c29yZW5zZW4sIGNvbG9yPWFsbHJhdXB5JHJhdXBjcmljaykpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkrDQogIGdlb21fc21vb3RoKG1ldGhvZD1sbSwgY29sb3VyPSJibGFjayIpKw0KICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IHBhbCkrDQogIHRoZW1lX2J3KCkrDQogIHlsYWIoIlNvcmVuc2VuIEluZGV4IikrDQogIHhsYWIoIkVhcmx5IFNlYXNvbiBXYXRlciBEZXB0aCAobSkiKSsgDQogIGxhYnMoY29sb3IgPSAiUmF1cCBDcmljayIpKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSkNCg0KZ2dkYzI8LWdncGxvdChhbGxzb3JleSwgYWVzKHg9ZGVwdGhjaGFuZ2UsIHk9c29yZW5zZW4sIGNvbG9yPWFsbHJhdXB5JHJhdXBjcmljaykpKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC41KSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBjb2xvdXI9ImJsYWNrIikrDQogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gcGFsKSsNCiAgdGhlbWVfYncoKSsNCiAgeWxhYigiU29yZW5zZW4gSW5kZXgiKSsNCiAgeGxhYigiV2F0ZXIgRGVwdGggQ2hhbmdlIChtKSIpKyANCiAgbGFicyhjb2xvciA9ICJSYXVwIENyaWNrIikrIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpKQ0KDQpncml0dHk8LWdyaWQuYXJyYW5nZShnZ2FyZWEyLCBnZ2RjMiwgZ2dzZDIsIGdnZ3JhejIsIGdncGVybTIsIG5yb3cgPSAyKQ0KIyBnZ3NhdmUoZmlsZT0iZ3JvdHR5LnBuZyIsIGdyaXR0eSkNCmBgYA0KDQotLS0tLS0NCg0KIyMgVGFrZWF3YXlzDQoNCjEuIEFyZWEgd2FzIGEgcG9vciBwcmVkaWN0b3Igb2YgcmljaG5lc3MgYWZ0ZXIgYWNjb3VudGluZyBmb3Igb3RoZXIgdmFyaWFibGVzLiBIeWRyb2xvZ2ljYWwgdmFyaWFibGVzIHdlcmUgbXVjaCBiZXR0ZXIgcHJlZGljdG9ycyBvZiByaWNobmVzcy4gDQoNCjIuIERpc3RhbmNlIGJldHdlZW4gc2l0ZXMgZGlkIG5vdCBzaWduaWZpY2FudGx5IGNvcnJlbGF0ZSB3aXRoIGNvbW11bml0eSBzaW1pbGFyaXR5IGJldHdlZW4gc2l0ZXMuIA0KDQozLiBDb21tdW5pdHkgc2ltaWxhcml0eSB3YXMgc2lnbmlmaWNhbnRseSBhZmZlY3RlZCBieSB3YXRlciBwZXJtYW5lbmNlLCB3YXRlciBkZXB0aCBjaGFuZ2UsIGFuZCBncmF6aW5nLiANCg0KNC4gU3RvY2hhc3RpY2l0eSBpcyBkZXBlbmRlbnQgb24gc2l0ZSBjb25kaXRpb25zLiBTaXRlcyB0aGF0IGFyZSBzbWFsbCwgc2hhbGxvdywgZ3JhemVkLCBhbmQvb3IgZXhwZXJpZW5jZSBsYXJnZSBzZWFzb25hbCBjaGFuZ2VzIGluIHdhdGVyIGRlcHRoIGV4cHJlc3MgYSBsYXJnZXIgc3RvY2hhc3RpYyBzaWduYWwuDQoNCg0KDQoNCg==